位运算符运算详解

今天在刷 LeetCode 算法题时遇到了一个用异或解决的题,自己也不是特别熟悉那几个运算符,所以尝试并记录一下

原码、反码,补码解释

  1. 对于有符号的数而言,最高位为符号位,0 表示正数,1 是表示负数
    例如:1 的有符号二进制值为 00000001,-1 的有符号二进制值为 10000001
  2. 正数的原码、反码、补码都一样
    例如:1 的原码为 00000001,反码也为 00000001,补码也为 00000001
  3. 负数的反码为符号位不变,其他位取反,补码为反码+1
    例如:-1 的原码为 10000001,反码为 11111110,补码为 11111111
  4. 0 的反码、补码都为 0
  5. 在计算机运行时,都是以补码的方式来运算的,但是在我们看的时候看到的是原码

一、按位与(&)

相同的位数上的数,都是 1 的时候就是 1,否则就为 0

  1. 举例说明:2&3
    运算方法:2 的补码为 00000010,3 的补码为 00000011
    只有倒数第二位都是 1,所以 2&3 的补码就是 00000010,正数原码补码相同,转换为 10 进制值就是 2
  2. 举例说明:3&4
    运算方法:3 的补码为 00000011,4 的补码为 00000100
    没有相同位数都是 1 的,所以 3&4 的补码就是 00000000,正数原码补码相同,转换为 10 进制值就是 0
  3. 举例说明:4&5
    运算方法:4 的补码为 00000100,5 的补码为 00000101
    只有倒数第三位都是 1,所以 4&5 的补码就是 00000100,正数原码补码相同,转换为 10 进制值就是 4
  4. 举例说明:-2&2
    运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010
    只有倒数第二位都是 1,所以-2&2 的补码就是 00000010,正数原码补码相同,所以最终结果就是 00000010 转为 10 进制值为 2
    按位与执行结果

二、按位或(|)运算符

相同的位数上的数,至少有一个是 1 的时候就是 1,否则就是 0

  1. 举例说明:2|3
    运算方法:2 的补码为 00000010,3 的补码为 00000011
    倒数第一、二位都是 1,所以 2|3 的补码就是 00000011,正数原码补码相同,转换为 10 进制值就是 3
  2. 举例说明:3|4
    运算方法:3 的补码为 00000011,4 的补码为 00000100
    倒数第一、二、三位都是 1,所以 3|4 的补码就是 00000111,正数原码补码相同,转换为 10 进制值就是 7
  3. 举例说明:4|5
    运算方法:4 的补码为 00000100,5 的补码为 00000101
    倒数第一、三位都是 1,所以 4|5 的补码就是 00000101,正数原码补码相同,转换为 10 进制值就是 5
  4. 举例说明:-2|2
    运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010
    只有倒数第一位是 0,所以-2&2 的补码就是 11111110,反码为 11111101,原码为 10000010,所以最终结果就是 10000010 转为 10 进制为-2
    按位或执行结果

三、按位异或(^)运算符

相同的位数上的数,相同就是 0,不同就是 1

  1. 举例说明:2^3
    运算方法:2 的补码为 00000010,3 的补码为 00000011
    只有倒数第一位不同,所以 2^3 的补码就是 00000001,正数原码补码相同,转换为 10 进制值就是 1
  2. 举例说明:3^4
    运算方法:3 的补码为 00000011,4 的补码为 00000100
    倒数第一、二、三位都不同,所以 3^4 的补码就是 00000111,正数原码补码相同,转换为 10 进制值就是 7
  3. 举例说明:4^5
    运算方法:4 的补码为 00000100,5 的补码为 00000101
    只有倒数第一位不同,所以 4^5 的补码就是 00000001,正数原码补码相同,转换为 10 进制值就是 1
  4. 举例说明:-2^2
    运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010
    只有后两位相同,所以-2&2 的补码就是 11111100,反码为 11111011,原码为 10000100,所以最终结果就是 10000100 转为 10 进制为-4
    按位异或执行结果

四、左移(<<)运算符

所有位上的值向左移,符号位不变,溢出补 0

  1. 举例说明:3<<1
    运算方法:3 的补码为 00000011,向左移 1 位后的补码是 00000110,正数原码补码相同,转换为 10 进制值就是 6
  2. 举例说明:3<<2
    运算方法:3 的补码为 00000011,向左移 2 位后的补码是 00001100,正数原码补码相同,转换为 10 进制值就是 12
  3. 举例说明:3<<3
    运算方法:3 的补码为 00000011,向左移 3 位后的补码是 00011000,正数原码补码相同,转换为 10 进制值就是 24
  4. 举例说明:-3<<3
    运算方法:-3 原码为 10000011,反码为 11111100,补码为 11111101,向左移 3 位后补码是 11101000,反码为 11100111,原码为 10011000,所以最终结果就是 10011000 转为 10 进制为-24
    左移执行结果

五、右移(>>)运算符

所有位上的值向右移,符号位不变,溢出补符号位的值

  1. 举例说明:7>>1
    运算方法:7 的补码为 00000111,向右移 1 位后的补码是 00000011,正数原码补码相同,转换为 10 进制值就是 3
  2. 举例说明:7>>2
    运算方法:7 的补码为 00000111,向右移 2 位后的补码是 00000001,正数原码补码相同,转换为 10 进制值就是 1
  3. 举例说明:7>>3
    运算方法:7 的补码为 00000111,向右移 3 位后的补码是 00000000,正数原码补码相同,转换为 10 进制值就是 0
  4. 举例说明:-7>>3
    运算方法:-7 的原码为 10000111,反码为 11111000,补码为 11111001,向右移 3 位后补码是 11111111,反码为 11111110,原码为 10000001,所以最终结果就是 10000001 转为 10 进制为-1
    右移执行结果

六、否(~)

所有位上的值变为相反的数,0 变为 1,1 变为 0

  1. 举例说明:~1
    运算方法:1 的补码为 00000001,所以~1 的补码为 11111110,反码为 11111101,原码为 10000010,所以最终结果就是 10000010 转为 10 进制为-2
  2. 举例说明:~2
    运算方法:2 的补码为 00000010,所以~2 的补码为 11111101,反码为 11111100,原码为 10000011,所以最终结果就是 10000011 转为 10 进制为-3
  3. 举例说明:~3
    运算方法:3 的补码为 00000011,所以~3 的补码为 11111100,反码为 11111011,原码为 10000100,所以最终结果就是 10000100 转为 10 进制为-4
  4. 举例说明:~-3
    运算方法:-3 的原码为 10000011,反码为 11111100,补码为 11111101,所以~-3 的补码为 00000010,正数原码补码相同,转换为 10 进制为 2
    否执行结果
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值