关于位运算符操作的深度分析

位运算符
所有的数据的运算都是采用补码进行的
又因为正数的远反补码都相同,所以正数可以直接拿二进制来计算。
在此就用正数举例说明位运算符的用法
举例:
int a = 3;
int b = 4;
int 3的补码为:00000000 00000000 00000000 00000011
int 4的补码为:00000000 00000000 00000000 00000100

&:有0则0
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------------------------
00000000 00000000 00000000 00000000
最终结果为:0

|:有1则1
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------------------------
00000000 00000000 00000000 00000111
最终结果为:7

^:相同则0,不同则1
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------------------------
00000000 00000000 00000000 00000111
最终结果为:7
^位异或的特点: 一个数据被另一个数据异或两次,最终结果不变
例:
a ^ b ^ b = a
a ^ b ^ a = b

~:0变1,1变0
~按位取反运算符一般单独使用
~3 --> ~00000000 00000000 00000000 00000011 --> 11111111 11111111 11111111 11111100 [补码]

补码11111111 11111111 11111111 11111100
反码11111111 11111111 11111111 11111011
原码00000000 00000000 00000000 00000100

最终结果为:-4

<<左移:左边最高位丢弃,右边补齐0
例:int
3 << 2
左移两位
正数3的二进制位:
00000000 00000000 00000000 00000011
因为正数的原反补码都相同
00000000 00000000 00000000 00000011
去<-- (00)000000 00000000 00000000 00000011 补<-- (00)
00000000 00000000 00000000 0001100
最终结果:12【3 * 2 ^ 2 = 12】
结论:<< 就是将 << 左移的数据 * 2 的移动次幂
>>右移:最高位是0时,左边补齐0;最高位是1时,左边补齐1
例: int
-24 >> 2
首先写出-24的二进制,再写出我们操作的补码

原码10000000 00000000 00000000 00011000
反码11111111 11111111 11111111 11100111
补码11111111 11111111 11111111 11101000

11111111 11111111 11111111 11101000
补(11)–>11111111 11111111 11111111 111010(00) -->去
11111111 11111111 11111111 11111010【补码】

补码11111111 11111111 11111111 11111010
反码11111111 11111111 11111111 11111001
原码10000000 00000000 00000000 00000110

最终结果为:-6【-24 / 2 ^ 2】
总结:>> 就是将 >> 右移的数据 / 2 的位移次幂

>>>无符号右移:无论最高位是0还是1,左边补齐0
-24的补码:11111111 11111111 11111111 11101000
(00) --> 11111111 11111111 11111111 111010(00) --> 去
00111111 11111111 11111111 11111010【补码】

补码00111111 11111111 11111111 11111010
反码00111111 11111111 11111111 1111001
原码01000000 00000000 00000000 0000110

最终结果为:1074721818

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值