位运算在很多时候可以提高效率,小小的一行也能成为程序的亮点,今天简单介绍一下位运算以及一些小技巧,希望以后我可以想着用一下
一、逻辑运算
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再和这个数做与运算*/
}