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

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

  • 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...

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git提交新仓库代码,提示无权限,但用户名已修改

目录 1 用户名无权限 2 删除用户凭据 2.1 打开控制面板 2.2 找到“凭据管理器” 2.3 删除git历史 3 npm工具库添加git仓库指引 1 用户名无权限 之前因为时间的原因&#xff0c;js-tool-big-box工具库没有提交到github上去&#xff0c;今天想着往上提交一下&#xff0c;但…

Linux系统中根下的目录结构介绍

一、Linux的路径分隔符 Linux系统中使用正斜杠(/)作为路径分隔符&#xff1b;每个目录的后面都默认带有一个正斜杠&#xff08;如&#xff1a;需要进入opt目录可以分别使用【cd /opt】或【cd /opt/】&#xff09; 二、Linux根目录下各个目录结构介绍 红色标识的文件夹为Linux的…

“开源AI”到底是什么意思

开源与专有软件之间的斗争早已为人所熟知。然而&#xff0c;长期以来弥漫在软件圈的紧张关系已经渗透到了人工智能领域&#xff0c;部分原因在于没有人能在AI背景下就“开源”的真正含义达成一致。 相关阅读&#xff1a;GPT-4o通过整合文本、音频和视觉实现人性化的AI交互&…

PTP时间同步协议简介

注意&#xff0c;上图中 t1 t4 都是主机时间。 t2 t3 都是从机时间。 总延迟为 (t4 - t1) - (t3 - t2) 单边的平均延迟为 ((t4 - t1) - (t3 - t2) ) / 2&#xff0c;公式d1 两边的时钟偏差为 (((t3 t2) / 2)) - ((t4 t1) / 2) 也可以通过下面2个式子 t2 offset delay t1…

Orangepi Zero2 全志H616 的初识

目录 一、全志H616简介 1.1 为什么学&#xff1a; 1.2 学什么&#xff1a; 1.3 全志H616平台介绍&#xff1a; 二、刷机 系统启动和初始化配置 2.1 需要的工具&#xff1a; 2.2 工具安装&#xff1a; 2.3 刷机&#xff1a; 2.4 登录系统&#xff1a; 2.5 修改登录密码…

Prometheus:开源监控解决方案的力量

前言 在当今高度数字化和云原生应用的时代&#xff0c;监控系统是确保系统稳定性和性能的关键组成部分。而 Prometheus 作为一种开源的监控解决方案&#xff0c;正在成为越来越多企业和开发者的首选。本文将深入探讨 Prometheus 的特性、优势以及如何利用它来构建强大的监控系…

CLion2024 for Mac[po] C和C++的跨平台解代码编辑器

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

python 二进制规则

反码&#xff0c;补码&#xff0c;还有0xffffffff到底是什么&#xff0c;今天仔细学&#xff01;&#xff01;&#xff01; 一&#xff0c;反码 例如 2&#xff0c;二进制为‘0b&#xff08;30个0&#xff09;10’。反码就是把其中0变成1&#xff0c;1变成0。 那就是 要使用&a…

Live Wallpaper Themes 4K Pro for Mac v19.9 超高清4K动态壁纸

Live Wallpaper & Themes 4K Pro for Mac v19.7 是一款专为Mac用户设计的超高清4K动态壁纸应用程序。它凭借出色的视觉效果和丰富的个性化设置&#xff0c;为用户带来全新的桌面体验。 这款软件提供了大量精美的动态壁纸供用户选择&#xff0c;涵盖了各种风格和主题&#…

秒杀业务的思考

文章目录 超卖问题&#xff1a;在redis判断和扣减库存不是原子操作&#xff0c;可以使用redis Lua脚本来避免超卖&#xff0c;但是这种情况会损失性能&#xff0c;并且也容易出现请求超时的情况&#xff0c;这时候还得设置超时时间&#xff0c;这种方式性能差。 其实像营销系统…

2-16 基于matlab的动载荷简支梁模态分析程序

基于matlab的动载荷简支梁模态分析程序&#xff0c;可调节简支梁参数&#xff0c;包括截面宽、截面高、梁长度、截面惯性矩、弹性模量、密度。输出前四阶固有频率&#xff0c;任意时刻、位置的响应结果。程序已调通&#xff0c;可直接运行。 2-16 matlab 动载荷简支梁模态分析 …

原生js实现图片预览控件,支持丝滑拖拽,滚轮放缩,放缩聚焦

手撸源代码如下&#xff1a;注释应该很详细了&#xff0c;拿去直用 可以放到在线编辑器测试&#xff0c;记得修改图片路径 菜鸟教程在线编辑器 <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" conten…

机器学习--KNN算法

目录 一、实验目的 二、实验的软、硬件平台 三、实验内容概述 四、实验设计方案 五、实验内容 一、实验目的 通过本实验掌握kNN算法的原理&#xff0c;熟悉kNN算法。 二、实验的软、硬件平台 python 3.6.5 CourseGrading在线实验环境 三、实验内容概述 1.kNN算法简介…

Android开发系列(九)Jetpack Compose之ConstraintLayout

ConstraintLayout是一个用于构建复杂布局的组件。它通过将子视图限制在给定的约束条件下来定位和排列视图。 使用ConstraintLayout&#xff0c;您可以通过定义视图之间的约束关系来指定它们的位置。这些约束可以是水平和垂直的对齐、边距、宽度和高度等。这允许您创建灵活而响…

快速入门LAMP架构:原理、搭建与优化

摘要&#xff1a; 本文详细阐述了LAMP&#xff08;Linux、Apache、MySQL、PHP&#xff09;架构的原理、搭建过程以及优化策略。首先介绍了LAMP架构的组成部分和各自的功能&#xff0c;然后逐步指导读者如何在Linux系统上安装和配置Apache、MySQL和PHP&#xff0c;最后探讨了如何…

⭐最新版!SpringBoot正确集成PageHelper姿势,不再被误导!

GGBond&#x1f508; CSDN的朋友们大家好哇&#xff0c;我是新来的Java练习生 CodeCodeBond&#xff01; 什么是PageHelper&#xff1f; 这里给不知道的人儿说明一下~~ 知道的xdm可以跳过了&#xff01; PageHelper顾名思义是一个 页面 帮手。也就是分页查询的一个好用的工具…

自定义距离与相似性度量:Scikit-learn中的高级聚类技术

自定义距离与相似性度量&#xff1a;Scikit-learn中的高级聚类技术 在机器学习领域&#xff0c;聚类是一种无监督学习方法&#xff0c;用于将数据集中的样本划分为不同的组别&#xff0c;使得同一组内的样本相似度高&#xff0c;而不同组间的样本相似度低。Scikit-learn作为Py…

进阶篇08——MySQL管理

系统数据库 常用工具 mysql 客户端工具 mysqladmin 执行管理操作 mysqlbinlog 数据库二进制日志转成文本 mysqlshow 数据库查找 mysqldump 数据库备份 mysqlimport/source 数据库导入

vue3前后端开发:响应式对象不能直接成为前后端数据传输的对象

如图所示&#xff1a;前端控制台打印显示数据是没问题的&#xff0c;后端却显示没有接收到相应数据&#xff0c;但是后端的确接收到了一组空数据 直接说原因&#xff1a;这种情况唯一的原因是没有按正确格式传递参数。每个人写错的格式各有不同&#xff0c;我只是说明一下我在…

[深度学习]长短期记忆网络LSTM

1. 理解序列建模和RNN 长短期记忆网络是一种递归神经网络&#xff08;RNN&#xff09;的变体&#xff0c;专门用于处理和预测时间序列数据。首先&#xff0c;理解标准RNN的基本工作原理是非常重要的&#xff0c;因为LSTM是其在解决长期依赖问题上的改进。 传统的循环神经网络…