位运算符
JAVA 进制转换的几个方法:https://blog.csdn.net/m0_37961948/article/details/80438113
十进制负数转换为二进制、八进制、十六进制:
https://blog.csdn.net/xiaochunyong/article/details/7616625
关于负数的右移与无符号右移运算小结:
https://blog.csdn.net/king_msky/article/details/17221973
按位与操作 0&0=0; 0&1=0; 1&0=0; 1&1=1
按位与运算符是“&”算目运算符。参与位运算的两数转换为二进制后相与,如果都为1则为1,否则为0。按位与运算通常是用来去除高位上的数;保留地位上的数。
举个例子:100的二进制数是0110 0100 ,15的二进制数是0000 1111,100&15二进制为0100转换为十进制为4
|: 按位或
参加运算的两个对象,按二进制位进行“或”运算
运算规则: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即可得到。
^: 异或运算符
参加运算的两个数据,按二进制位进行异或运算。
运算规则:0^0=0; 1^0=1; 0^1=1; 1^1=0;
即: 参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
例如:10^-9即0000 1010^1111 0111 = 1111 1101(补码)原码即为1000 0011 即10^-9=-3
异或运算的特殊用处:
(1)使特定位翻转 找一个数,对应X要翻转的各位,该数对应位为1,其余位为0,此数与X对应位异或既可。
例:X = 10101110,使X低4位翻转,用X^0000 1111 = 1010 0001即可得到。
(2)与0相异或,保留原值,X^0000 0000 =1010 1110。
(3)交换a和b
方法一 | 方法二 |
---|---|
1.a=a^b | 1.a= a-b |
2.b=b^a | 2.b= a+b |
3.a=a^b | 3.a= b-a |
位运算符 | 例子 | 相当于 |
---|---|---|
&= | 例:a &= b | 相当于a=a & b |
|= | 例:a |= b | 相当于a=a | b |
>>= | 例:a >>= b | 相当于a=a >> b |
<<= | 例:a <<= b | 相当于a=a << b |
^= | 例:a ^= b | 相当于a=a ^ b |
运算规则:和前面的复合赋值运算符的运算规则相似。
如:long a=123;int b=1;计算a & b。
a&b | |
---|---|
a | 0000 0000 0111 1011 |
b | 0000 0000 0000 0001 |
= | 0000 0000 0000 0001 |
如:long a=123;int b=-1;计算a & b。
a&b | |
---|---|
a | 0000 0000 0111 1011 |
b | 1111 1111 1111 1111 |
= | 0000 0000 0111 1011 |
如:long a=123;unsigned int b=1;计算a & b。
a&b | |
---|---|
a | 0000 0000 0111 1011 |
b | 0000 0000 0000 0001 |
= | 0000 0000 0000 0001 |
反码:正数的反码与原码相同;负数的反码符号位不变其余按位取反