与(&) | 0&0=0 | 0&1=0 | 1&0=0 | 1&1=1 |
---|---|---|---|---|
或(|) | 0|0=0 | 0|1=1 | 1|0=1 | 1|1=1 |
异或(^) | 0^0=0 | 0^1=1 | 1^0=1 | 1^1=0 |
参与运算的两数对应的二进位相与,只有对应的2个二进位均为1时,结果位才为1 ,否则为0
例:6 & 1 = 0
0110(6的二进制)
&
0001(1的二进制)
=
0000 (0的二进制)
参与运算的两数对应的二进位相或,只要对应的2个二进位有一个为1时,结果位就为1。
例:5 | 8 = 13
0101(5的二进制)
|
1000(8的二进制)
=
1101 (13的二进制)
参与运算的两数各对应的二进位相异或,当对应的2个二进位相异时,结果位为1,相同则结果位为0。
例:9 ^ 5 = 12,
1001(9的二进制)^
0101 (5的二进制)1100 (12的二进制)
对参与运算的数的各二进位按位求反。
~9:
~(1001) = 0110
按二进制形式把所有的数字向左移动对应的位数,高位舍弃,低位补零。
需要移位的数字 << 移位的次数
3 << 2 = 12
(0011 移位后得 1100)
在数字没有溢出的前提下,左移 n
位就相当于乘以 2
的 n
次方。
按二进制形式把所有的数字向右移动对应的位数,低位舍弃,高位补符号位(即正数补零,负数补1)。
需要移位的数字 >> 移位的次数
11>>2 = 2
(1011 移位后得 0010 )
对于正数,右移 n
位相当于除以 2
的 n
次方。
num
的第 i
位是否为 1
public boolean getBit(int num, int i)
{
return (num & (1 << i)) != 0;
}
num
的第 i
位设置为 1
public int setBit(int num, int i)
{
return num | (1 << i);
}
num
的第 i
位清零public int clearBit(int num, int i)
{
int mask = ~(1 << i); //形如 1110111
return num & mask;
}
num
的第 i
位更新为 v
public int updateBit(int num, int i, int v)
{
num = clearBit(num, i); //将 num 的第 i 位清零
return num | (v << i); //将 num 的第 i 位设置为 v
}
原码:一个整数按照绝对值的大小转化成二进制的数
反码:将二进制数按位取反
补码:反码加 1
负数以正数的补码表示
2进制用0b表示
8进制用0o表示
10进制用0d表示
16进制用0x表示