C编程-位操作

代码里偶尔会看到一些位操作运算,有些不熟,看起来有点费解,下面做些梳理,便于记忆回顾。

一、与操作 

与操作的特点就是只有都为1,结果才为1,其他情况都是0 

常用的实现就是用来判断某个位是否置为1 

x & (1 << n) == 宏定义 

或者(x >> n) & 1 ==  1

还有用来将某一位置0 

x & (~(1 << n))

其他一些实现操作: 

1、判断奇偶性(也就是上面讲的只判断最后一位是否为1) 

x & 1 

只要是偶数,结果就是0;如果是奇数,结果就是1

2、清除二进制最后一个1(该特性可以用来计算一个二进制数有多少个1) 

x & (x-1) 

3、获得二进制最后一个1 

x & -x

4、判断x是否是y的整数倍 

x == x & ~(y-1) 

如果相等就说明x是y的整数倍,如果想将x做y的整数倍向上补齐,则可以使用如下表达式 

(x+y) & ~(y-1) 

这个在AES计算时比较常见

5、将右边的n位清零,在网段计算中有使用到 

x & (~0 << n) 

6、保留右边的n位,将前面的数都清零 

x & ((1 << n) - 1)

<br/>

二、或操作 

或操作的特点就是只要操作的一方是1,结果就是1

常用实现就是将某一位置1 

比如一个整数32位,每一位分别代表一个功能标记,如果支持,就将对应的位置1 

x | (1 << n)

<br/>

三、异或操作 

异或操作的特点是两个数相同是0,不同是1 

常见实现操作 

1、x ^ x = 0 ; x ^ 0 = x 

2、x ^ y = z; z ^ x = y; z ^ y = x (通过位操作来实现两个数交换) 

3、x ^ ~(0) = ~x ; x ^ ~x = ~(0)

上面三个看着有个规律就是一个数与另一个数进行异或操作的结果,其结果和前面其中一个数进行异或操作会得到另一个数


也欢迎关注我的公众号:一周思进

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容