java位运算
进制转换
进制转换:https://jingyan.baidu.com/article/495ba84109665338b30ede98.html
二进制转十进制
二进制转8进制
二进制转16进制
十进制转二进制
方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止
8进制转二进制
16进制转二进制
十进制转8进制、16进制
8进制、16进制转十进制
移位运算符
注:以下num均为正整数
左移运算符 <<
num << n, 二进制左移n位,低位用0补齐
- num<<1相当于 num*2
# 3的二进制为0011
# 3<<1 = 6,6的二进制为0110
System.out.println(Integer.toBinaryString(3)); // 0011
System.out.println(Integer.toBinaryString(3<<1)+" -> "+(3<<1)); // 0110 -> 6
右移运算符 >>
num>>n,二进制右移n位,去掉低位n位
- num>>1,相当于num/2,整数为num/2,奇数为(num-1)/2
# 5的二进制为0101
# 5>>1 = 2,2的二进制为0010
System.out.println(Integer.toBinaryString(5)); // 0101
System.out.println(Integer.toBinaryString(5>>1)+" -> "+(5>>1)); // 0010 -> 2
无符号右移 >>>
无符号右移,忽略符号位,空位都以0补齐
正数与右移动>>类似
- 负数请查阅https://www.jb51.net/article/34133.htm**https://www.jb51.net/article/34133.htm
按位与、或、非,异或等运算方法
按位与运算符(&)
参加运算的两个数据,按照二进制位进行与运算。
运算规则:0&0=0,0&1=0,1&0=0,1&1=1
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。
与运算”的特殊用途:
- 清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
- 取一个数中指定位
方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。
例:设X=10101110,
取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;
还可用来取X的2、4、6位。
按位或运算符(|)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:
3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7
另,负数按补码形式参加按位或运算。
“或运算”特殊作用:
- 常用来对一个数据的某些位置1。
方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。
例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。
非运算符(~)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0。
- 使一个数的最低位为零,可以表示为:num&~1。
~1的值为1111111111111110,再按“与”运算,最低位一定为0
异或运算符(^)
0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0; 0 ^ 0 = 0;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 0000 0011 ^ 0000 0101 =0000 0110 因此,3^5的值得6;
- 交换两个值
int a = 3, b = 5;
a ^= b;
b ^= a;
a ^= b;
// 结果 a = 5, b = 3;