位运算
来源:互联网 发布:马云放弃淘宝c店 编辑:程序博客网 时间:2024/06/06 08:26
位运算在很多时候可以提高效率,小小的一行也能成为程序的亮点,今天简单介绍一下位运算以及一些小技巧,希望以后我可以想着用一下
一、逻辑运算
1.逻辑&,就是将两个数的二进制按位进行&(同1则1),如果有负数,则按照补码进行运算
应用:
(1) 清零 清零:将其全部的二进制位全部置为0。例如整型数a=321对其全部数据清零的操作为a=a&0x00。 321=0000 0001 0100 0001 &0=0000 0000 0000 0000
= 0000 0000 0000 0000
(2) 获取一个数据的指定位
获取一个数据的指定位。例如获得整型数a=的低八位数据的操作为a=a&0xFF。321=
0000 0001 0100 0001 & 0xFF =0000 0000 1111 11111
= 0000 0000 0100 0001
获得整型数a=的高八位数据的操作为a=a&0xFF00。==a&0XFF00==
321=0000 0001 0100 0001 & 0XFF00=1111 1111 0000 0000
= 0000 0001 0000 0000
2、逻辑|,就是将两个数的二进制按位进行|(有1则1),如果有负数,则按照补码进行运算应用:
设定一个数据的指定位。例如整型数a=321,将其低八位数据置为1的操作为a=a|0XFF。321= 0000 0001 0100 0001 | 0000 0000 1111 1111=0000 0000 1111 1111
3.逻辑异或^
就是将两个数的二进制按位进行^ (相同为0不同为1)
用途:
(1)定位翻转
定位翻转:设定一个数据的指定位,将1换为0,0换为1。例如整型数a=321,,将其低八位数据进行翻位的操作为a=a^0XFF;
(2)数值交换
数值交换。例如a=3,b=4。在例11-1中,无须引入第三个变量,利用位运算即可实现数据交换。以下的操作可以实现a,b两个数据的交换:
a=a^b;
b=b^a;
a=a^b;
4、逻辑~
将数的二进制按位取反
二、位移运算
位左移即乘以2,右移即除以二
下面贴一下常用的技巧:
1.判断奇偶
boolean isOddNumber(int n){ return (n & 1) == 1; }
boolean isSameSign(int x, int y){ //有0的情况例外 return (x ^ y) >= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。 }
int getFactorialofTwo(int n){//n > 0 return 2 << (n-1);//2的n次方 }
4.判断一个数是不是2 的幂
boolean isFactorialofTwo(int n){ return n > 0 ? (n & (n - 1)) == 0 : false; /*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/ }
5.从低位到高位,将n的第m位置1
int setBitToOne(int n, int m){ return n | (1 << (m-1)); /*将1左移m-1位找到第m位,得到000...1...000 n在和这个数做或运算*/ }
6.从低位到高位,将n的第m位置0
int setBitToZero(int n, int m){ return n & ~(1 << (m-1)); /* 将1左移m-1位找到第m位,取反后变成111...0...1111 n再和这个数做与运算*/ }