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

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

  • 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 = 0
    for bit in data:
        check_bit ^= int(bit)
    return check_bit

data1 = '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 True

def get_false():
    print('get_false run...')
    return False

if get_true() or get_false():
    pass
if get_false() and get_true():
    pass

# get_true run...
# get_false run...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/754549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信创认证 | Smartbi Insight V11成功适配申威3231处理器

在信息技术飞速发展的浪潮中&#xff0c;软硬件的深度融合与协同发展已成为推动行业创新的关键因素。 近日&#xff0c;思迈特商业智能与数据分析软件[简称&#xff1a;Smartbi Insight]V11在统信服务器操作系统V20和中电科申泰信息科技有限公司产品申威3231处理器环境下完成适…

CAN和CANFD数据写入.asc文件的dll

因为工作需要&#xff0c;需要做一些硬件不是CANoe的上位机&#xff08;比如说周立功CAN,NI-CAN&#xff09;&#xff0c;上位机需要有记录数据的功能&#xff0c;所以用Qt制作了一个记录数据的dll&#xff0c;方便重复使用&#xff08;因为有的客户指定了编程软件&#xff0c;…

51循迹小车(蓝牙+循迹+超声波+舵机+避障L298N)

基本驱动 L298N电机驱动模块负责供电和控制电机驱动 将电池12V供电接到12V供电上&#xff0c;作为输入。单片机及其他器件供电可以使用5V供电&#xff0c;这里的GND都接到一起。 输出A和输出B接到电机上&#xff0c;负责给电机供电和控制电机。 通道A使能和通道B使能以及逻…

【Windows下使用vckpg下载protoc之后环境变量问题】

使用vcpkg进行下载的protoc&#xff1a; vcpkg install protobuf protobuf:x64-windows 检查protoc版本时出现问题&#xff1a; “protoc”不是内部或外部命令&#xff0c;也不是可运行程序或批处理文件 尝试添加系统环境变量后没有反应。 这个时候找到vckpg下的packages目录…

如何利用ChatGPT寻找科研创新点?分享5个有效实践技巧

欢迎关注&#xff1a;智写AI&#xff0c;为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥交流&#xff1a;yida985 地表功能最强大的高级学术专业版已经开放&#xff0c;拥有全球领先的GPT学术科研应用&#xff0c;有兴趣…

鸿蒙开发设备管理:【@ohos.brightness (屏幕亮度)】

屏幕亮度 该模块提供屏幕亮度的设置接口。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import brightness from ohos.brightness;brightness.setValue setValue(value: number):…

【Linux】网络编程套接字

一、预备知识 1.1 理解源IP地址和目的IP地址 在IP数据报的头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 源IP地址和目的IP地址是网络通信中常用的两个概念&#xff0c;他们代表了通信中的两个节点。 源IP地址是指发起通信的节点的IP地址&#…

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中&#xff0c;默认情况下 root 用户是禁用 SSH 登录的&#xff0c;这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置项。默认情况下&#xff0c;它通常被设置为 PermitRootLogin prohibit-password 或…

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩&#xff1f;举个例子你就彻底懂了&#xff01;&#xff01; 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下&#xff0c;你开了一家便利店&#xff0c;店里…

FastAPI教程I

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 第一步 import uvicorn from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}if __name__ __main__:uvicorn.run(&quo…

从我邮毕业啦!!!

引言 时间过的好快&#xff0c;转眼间就要从北邮毕业了&#xff0c;距离上一次月度总结又过去了两个月&#xff0c;故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 毕业&#x1f393; 6月1号完成了自己的…

Windows server 2016.2019 .NET Framework 3.5安装包、安装步骤

windows server2019 操作系统 安装 sqlserver2008时提示缺少 .NET Frameword 3.5&#xff0c; 在功能里选择 .NET Frameword 3.5安装报错&#xff0c; 下载安装包&#xff0c;下载地址 https://download.csdn.net/download/qq445829096/89450429这里指定备份源路径 安装包解…

多供应商食品零售商城系统的会员营销设计和实现

在多供应商食品零售商城系统中&#xff0c;会员营销是提升用户粘性和增加销售的重要手段。一个有效的会员营销系统能够帮助平台更好地了解用户需求&#xff0c;提供个性化服务&#xff0c;进而提高用户满意度和忠诚度。本文将详细探讨多供应商食品零售商城系统的会员营销设计与…

2毛钱不到的2A同步降压DCDC电压6V频率1.5MHz电感2.2uH封装SOT23-5芯片MT3520B

前言 2A&#xff0c;2.3V-6V输入&#xff0c;1.5MHz 同步降压转换器&#xff0c;批量价格约0.18元 MT3520B 封装SOT23-5 丝印AS20B5 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 2A 输出电流 无需肖特基二极管 2.3V至6V输入电压范围 输出电压低至 0.6V PFM 模式可在…

MySQL进阶-索引-使用规则-索引失效情况一(索引列运算,字符串不加引号,头部模糊匹配)

文章目录 1、索引列运算1.1、查询表tb_user1.2、查看tb_user的索引1.3、查询 phone177999900151.4、执行计划 phone177999900151.5、查询 substring(phone,10,2) 151.6、执行计划 substring(phone,10,2) 15 2、字符串不加引号2.1、查询 phone177999900152.2、执行计划 phone177…

JAVA-矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路&#xff1a; 找到0的位置&#xff0c;把0出现的数组的其他值夜置为0 需要额外空间方法&#xff1a; 1、定义两个布尔数组标记二维数组中行和列…

axios之CancelToken取消请求

从 v0.22.0 开始&#xff0c;Axios 支持以 fetch API 方式—— AbortController 取消请求 此 API 从 v0.22.0 开始已被弃用&#xff0c;不应在新项目中使用 官网链接 1. 背景 最近项目中遇到一个场景&#xff0c;当连续触发一个请求时&#xff0c;如果是同一个接口&#xf…

【仿真建模-anylogic】开发规范

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-28 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 0. 说明 实际模型开发过程中&#xff0c;对遇到的问题进行总结归纳出以下开发规范&#xff0c;仅供参考&#xff01; 1. 强制性规范 1…

加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库

文章目录 Java Cryptography Architecture (JCA)开源国密库国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; 在线生成公钥私钥对&#xff0c;RSA公私钥生成参考…

单目操作符

目录 ! --- 逻辑反操作 & --- 取地址操作符 * --- 间接访问操作符&#xff08;解引用操作符&#xff09; sizeof --- 操作数的类型长度&#xff08;单位为字节&#xff09; ~ --- 对一个数的补码二进制按位取反 前置和前置-- 后置和后置-- (类型) --- 强制类型转换…