算法(位运算)

博客介绍了负数位运算,负数以补码形式运算,结果首位为1时需再求补码。还列举了 -10、 -9补码及 10 ^ -10、 -9 & -10 运算示例。同时给出常用规则,如异或、消除或保留二进制最右 1 等规则。

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

负数的位运算:

负数进行位运算时是以补码形式进行的,如果运算结果首位为1,结果也需要求一次补码,才能得到最终的结果。

例子如下:
1.-10的补码:
#原码,负数首位为1
1000 0000 0000 0000 0000 0000 0000 1010

最右边的1和1后面的不变,首位不变,其余位取反:

#补码
1111 1111 1111 1111 1111 1111 1111 0110
2.-9的补码:
#原码,负数首位为1
1000 0000 0000 0000 0000 0000 0000 1001

最右边的1和1后面的不变,首位不变,其余位取反:

#补码
1111 1111 1111 1111 1111 1111 1111 0111

1.以 10 ^ -10 为例:

  0000 0000 0000 0000 0000 0000 0000 1010
^ 1111 1111 1111 1111 1111 1111 1111 0110
= 1111 1111 1111 1111 1111 1111 1111 1100

得到的结果首位为1,所以再求一次补码:

1000 0000 0000 0000 0000 0000 0000 0100

即 -4

1.以 -9 & -10 为例:

  1111 1111 1111 1111 1111 1111 1111 0111
& 1111 1111 1111 1111 1111 1111 1111 0110
= 1111 1111 1111 1111 1111 1111 1111 0110

得到的结果首位为1,所以再求一次补码:

1000 0000 0000 0000 0000 0000 0000 1010

即 -10

常用的一些规则:
1.任何数和0做异或(^)都是其自身。
-2^0 = -2    -1 ^ 0 = -1   0 ^ 0 = 0   1 ^ 0 = 1   2 ^ 0 = 2    123 ^ 0 = 123
2.n & (n-1) 可以消除n的二进制表示的最右边的一个1,常用于判断n的二进制表示中有多少个1或判断是不是2的次幂。
3.n & ~(n-1) 可以只保留n的二进制表示的最右边的一个1。
4.(n >> i) & 1 可以取n的第i位(0或者是1)
5.n & (n >> 1)是否等于0可以判断n的二进制表示有没有相邻的两位都是1,如果n & (n >> 1)==0代表没有相邻两位都是1,反之代表有相邻两位都是1
6.a & (-a) 可以获得a最低的非0位,例如a=20(二进制是10100,最低位非0位对应的数是4), 则a&(-a)就等于4,负0的特点是第一位是1,其余位是0,所以它的最低有效位就是自己(所以不能用前面的方法算,可能会溢出)

在这里插入图片描述

参考

位运算有什么奇技淫巧?
位运算简介及实用技巧(一):基础篇
位运算简介及实用技巧(二):进阶篇(1)
位运算简介及实用技巧(三):进阶篇(2)
位运算简介及实用技巧(四):实战篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值