位运算:按位与、按位或、按位异或、取反、左移、右移

本文详细介绍了位运算在编程中的基本概念,包括补码转换方法,按位与(&), 按位或(|), 按位异或(^), 取反(~), 左移(<<), 右移(>>)及其在Java和C中的应用。特别关注了负数补码表示和异或交换算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位运算不管是 Java 还是 C 中,或者其他语言,都会经常用到。位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)这几种,其中除了取反(~)以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。

1、补码
在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制数的时候,只需要通过除2取余的方法即可,但是怎么将一个十进制的负整数转换为二进制数呢?其实,负数是以补码的形式表示。其转换方式,简单的一句话就是:先按正数转换,然后取反加1。
补码

2、按位与(&)
参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该位为0。
按位与&

3、按位或(|)
参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1;如果均不为1,即为0。
按位或

4、按位异或(^)
参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该位才取1;若相同,即为0。
按位异或

可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:
swap

5、取反(~)
参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。
取反

6、左移(<<)
参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。
左移

注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4。

7、右移(>>)
参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。
右移

注意,观察可以发现,右移一位的结果就是原值除以2,右移两位的结果就是原值除以4,注意,除了以后结果没有小数位,都是取整。
Java中>>和>>>的区别:
O

  • 对于正数而言,>>和>>>没区别。
  • 对于负数而言,-2 >>> 1,结果是2147483647(Integer.MAX_VALUE);-1 >>>1,结果是2147483647(Integer.MAX_VALUE)。
    所以,要判断两个数符号是否相同时,可以这么干:
    return ((a >> 31) ^ (b >> 31)) == 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值