当前位置: 首页> 汽车> 新车 > 位运算符计算规则及使用场景

位运算符计算规则及使用场景

时间:2025/8/23 8:04:35来源:https://blog.csdn.net/atwdy/article/details/139772081 浏览次数: 0次

位运算符包括按位与&、按位异或^、按位或|、按位取反~、左移<<、右移>>

  • 1.&(按位与)
    • 1)限定数值范围
    • 2)权限检测
    • 3)掩码操作
  • 2.^(按位异或)
    • 1)两值交换
    • 2)加密解密
    • 3)错误检测(奇偶校验码 & CRC循环冗余检验)
    • 4)找不成对的数字
  • 3.|(按位或)
  • 4.~(按位取反)
  • 5.<<(左移)、>>(右移)
  • 补充:||(逻辑或)和 &&(逻辑与)

1.&(按位与)

运算规则:两个位的值都为1时结果为1,否则为0。(同真为真,一假即假)

使用场景:

1)限定数值范围

在一些源码中经常可以看到类似 result & xxx 的代码,主要作用就是对result的结果范围进行限制。&的计算规则决定了 a & b <= min(a, b)

2)权限检测

比如3位二进制数,1 2 3 位分别表示读 写 执行 权限,某用户有权限 100,表示仅有只读权限,我们可以通过 & 100检测读权限,& 010检测写权限,&001检测执行权限。当&的结果为0时表示无该权限,否则表示有。

3)掩码操作

就是只关注特定位的取值,忽略其它位。比如对于8位长度的二进制数,例如10110110,只想关注它们最后4位的取值,那么就可以让10110110 & 00001111,这样结果就能保证前面4位为0,后面4位保持不变。这里力扣上有个相关的题,比特位计数。

2.^(按位异或)

运算规则:两个位的值相同时为假0,相异时为1。(相同为假,相异为真)

使用场景:

1)两值交换

由异或的运算规则,有a^b^b=a,也就是一个数连续异或两次另一个数,原数不变。所以有swap(a, b):

a = a^b
b = a^b		# b=a^b=(a^b)^b=a
a = a^b		# a=a^b=(a^b)^a=b

2)加密解密

通过对字符的 unicode码 ^key 得到加密数据,对加密数据再次 ^key得到原字符。

key = 2024
def encrypt(data, key):return ''.join([chr(ord(c) ^ key) for c in data])text = 'hello, 今天是周二~'
encrypt_text = encrypt(text, key)
print(encrypt_text)
text = encrypt(encrypt_text, key)
print(text)# ހލބބއ߄߈䤢廁懇厀䥤
# hello, 今天是周二~

3)错误检测(奇偶校验码 & CRC循环冗余检验)

奇偶校验:
通过补0或者补1在传输的二进制后面追加一位校验位,当原二进制+校验位中1的个数为偶数时叫偶校验,为奇数时叫奇校验。异或在这里的作用是通过对二进制各bit位连续异或获取校验位的值。偶校验用0开始异或,奇校验用1开始异或。下面是个偶校验求取校验位的demo:

def even_check(data):check_bit = 0for bit in data:check_bit ^= int(bit)return check_bitdata1 = '10110'
data2 = '01010'
check_bit1 = even_check(data1)
check_bit2 = even_check(data2)
print(check_bit1)       # 1
print(check_bit2)       # 0

奇偶校验不能保证绝对校验正确,例如传输过程当两个bit都为1的位同时变为0,那就检验不出了。也不具有纠错的功能。

CRC循环冗余检验:
pass待补

4)找不成对的数字

力扣上有道类似的题,根据异或计算规则,两个相同的数字异或结果为0,而0异或任何数又等于这个数本身,一个序列内部所有的值连续异或,最后的结果就是那个不成对的数字。但是有个前提:序列中仅存在一个不成对的数字。

3.|(按位或)

按位或计算规则:两个bit位任意一个为1结果为1,否则为0。(一真即真,都假为假)
使用场景:基于或的运算规则,一般用来做合并相关的操作,如权限合并。实际中用的较少。

4.~(按位取反)

计算规则:0变1,1变0。
使用场景个人了解到的比较少。

5.<<(左移)、>>(右移)

左移:所有二进制位向左移动相同位数, n u m < < n = n u m ∗ 2 n num<<n = num*2^n num<<n=num2n
右移:所有二进制位向右移动相同位数, n u m > > n = n u m / 2 n num>>n = num / 2^n num>>n=num/2n。(除不尽时向下取整,负数也适用)

补充:||(逻辑或)和 &&(逻辑与)

大多数语言中,||&&分别用来表示逻辑或和逻辑与。这两个运算符看起来和位运算符|&很像,但不属于位运算符,计算规则也不是按位进行逐位比较的。

它们的计算规则是,将前后的数值当成一个整体,而非二进制。当这个整体值为0时表示假,大于0时表示真。对于逻辑或,左右两边有一个为真结果为真,逻辑与是左右两边有一个为假结果为假。

同时这两个运算符还有短路的特点,即第一位的真假取值,如果已经能决定整体的结果,那么第二位将不再进行计算。具体来说,对于逻辑或,如果第一位的值为真,则结果为真,第二位不计算。对于逻辑与,第一位的值为假,则结果为假,第二位不再计算。

下面是个demo,注意python中逻辑或和逻辑与用的是orand

def get_true():print('get_true run...')return Truedef get_false():print('get_false run...')return Falseif get_true() or get_false():pass
if get_false() and get_true():pass# get_true run...
# get_false run...
关键字:位运算符计算规则及使用场景

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: