位运算符
二进制和十进制之间的转换
a. 十进制-->二进制
除2的操作,直到除到0为止,获得的余数倒序就是十进制对应的二进制
byte 1一个字节 8位(二进制的位数)
short 2 16
int 4 32
long 8位 64
byte b=2;
2 -> 10
3 -> 11
15 -> 1111
13 -> 1101
b. 二进制-->十进制
1011 --> 11
2^3*1 + 2^2*0 + 2^1*1 + 2^0*1
8+0+2+1
11001 --> 25
2^4*1 + 2^3*1 + 2^2*0 + 2^1*0 + 2^0*1
16+8+0+0+1 25
32 16 8 4 2 1
最高位是符号位 0正数 1负数
原码:10001111
反码:11110000
原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),
其余位表示数值的大小。
例如,用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码(原码逐位取反)的末位加1。
3. 位运算符
<< 移位后,空位补0,被移除的高位丢弃,空缺位补0。 M << n 其实可以这么算 M << n = M * 2^n
>> 被移位的二进制最高位是0,右移后,空缺位补0; M >> n = M / 2^n 正数的原码 反码 补码一致
最高位是1,空缺位补1。
-15 1 0 0 0 1 1 1 1
反码 1 1 1 1 0 0 0 0
补码 1 1 1 1 0 0 0 1
右移3位 1 1 1 1 1 1 1 0
补码 1 1 1 1 1 1 0 1
反码 1 0 0 0 0 0 1 0
>>2得出 -2
>>> 被移位二进制最高位无论是0或者是1,空缺位都用0补。 若是正数 其实可以这么算 M << n = M * 2^n 负数则变成好大的正数
& 二进制位进行&运算,只有1&1时结果是1,否则是0;
| 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^ 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0
不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1
~ 正数取反,各二进制码按补码(此时为正整数)各位取反(变成负整数),再补码
(负整数补码原码符号位不变,先将原码减去1,最后数值位各位取反)
~15 0 0 0 0 1 1 1 1
反码 == 0 0 0 0 1 1 1 1
补码 == 0 0 0 0 1 1 1 1
取反 ~ 1 1 1 1 0 0 0 0
----------------------------------
补码 -1 1 1 1 0 1 1 1 1
反码 ~ 1 0 0 1 0 0 0 0
原码 -2^4 = -16
求负整数的补码,原码符号位不变,先将原码减去1,最后数值位各位取反。
(但由于2进制的特殊性,通常先使数值位各位取反,最后整个数加1。)
如下 结果一样
~15 0 0 0 0 1 1 1 1
反码 == 0 0 0 0 1 1 1 1
补码 == 0 0 0 0 1 1 1 1
取反 ~ 1 1 1 1 0 0 0 0
----------------------------------
数值位取反 1 0 0 0 1 1 1 1
+1 1 0 0 1 0 0 0 0 == -16
负数取反,各二进制码按补码各位取反, 再补码(但是正数的补码与其原码相同)
-34 1 0 1 0 0 0 1 0
反码 1 1 0 1 1 1 0 1
补码 1 1 0 1 1 1 1 0
取反 0 0 1 0 0 0 0 1 ==33
原文地址:https://www.cnblogs.com/Lovemeifyoudare/p/11440350.html