关于二进制按位运算的那些事

一:与运算(&): 可以看作二进制的 乘法运算

1 & 0 = 0

1 & 1 = 1

0 & 0 = 0

0 & 1 = 0

eg: 5 & 6 = 4

===》 5的2进制: 0000 0101

===》 6的2进制: 0000 0110

&运算===》 0000 0100 ===> 对应的 10 进制是:4

二:或运算(|): 0 或 1 中 只要有1 结果就是1

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

ps: 12 | 18 = 30

12 | 18 | 11 = 31 ==》 30 | 11 = 31

eg: 5 | 6 = 7

===》 5的2进制: 0000 0101

===》 6的2进制: 0000 0110

| 运算===》 0000 0111 ===> 对应的 10 进制是:7

三:按位取反运算(~): 针对于数字的二进制码,0 转换成 1,1转换成 0

~ 0 = 1

~ 1 = 0

eg: ~ 6 ==> 0000 0110 ==> 1111 1001 ==> 得出这个数字是负数, 然后获取到它的反码,再得到原码

对应反码(-1): 1111 1000

对应原码: 0000 0111

对应的10进制: 7

所以 ~6 对应 的是 -7

四:异或运算(^): 指两个数字展开成二进制后,分别对相应的位置上的数字进行运算相同取0,相异取 1

eg : 5 ^ 6 = 3

===》 5的2进制: 0000 0101

===》 6的2进制: 0000 0110

运算===》 0000 0011 ===> 对应的 10 进制是:3

五:左移运算(<<): 原理是将二进制数,所有数字向左移动,高位超出范围自动舍弃,低位补0

以一个short 的范围举例(一个short 是由二个字节组成,也就是由16个二进制数表示):

比如数字: 9 << 5 = 288

9 的二进制表示 : 00000000 00001001

向左移动5位,高位超出部分丢弃,低们补0: 00000001 00100000

对应的10进制: 1*2^8 + 1*2^5 = 1*256 + 1*32 = 288

笔者自己发现 9 << 5 可以等价于 ==》 9* 2^5 = 9* 32 = 288

推出公式等价: a << b ==> a * 2 ^ b

六:右移运算(>>>): 原理是将二进制数,所有数字向右移动,高位补0,低位超出范围,则舍弃。

以一个short 的范围举例(一个short 是由二个字节组成,也就是由16个二进制数表示):

比如数字: 304 >> 5 = 9

9 的二进制表示 : 00000001 00110000

向右移动5位,高位超出部分丢弃,低们补0: 00000000 00001001

对应的10进制: 1*2^3+1=9

笔者自己发现 304 >> 5 = 9 可以等价于 ==》 304/(2^5) = 304/32 = 9

推出公式等价: a >> b ==> a/(2 ^ b)

发布了54 篇原创文章 · 获赞 31 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u012149894/article/details/86521476