CSP备考---位运算

news2025/4/8 10:26:38

前言

        本期我们将学习位运算,与本期类型的考点(二进制转换)反码、补码、原码。

1、位运算是什么

首先我们需要先了解位运算是什么。

我们知道,计算机中的数在内存中都是以二进制形式进行存储的 ,而位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在程序中尽量使用位运算进行操作,这会大大提高程序的性能。

那么,涉及位运算的运算符如下表所示:

符号描述运算规则实例(以四位二进制数为例)
&两个位都为1时,结果才为1。0001&0001=1,0001&0000=0,0000&0000=0000
|两个位都为0时,结果才为0。0001∣0001=0001,0001∣0000=0001,0000∣0000=0000
^异或两个位相同为0,相异为1。0001∧0001=0000,0001∧0000=1,0000∧0000=0
~取反0变1,1变0。∼0=1,∼1=0
<<左移各二进位全部左移若干位,高位丢弃,低位补0。

0001<<k=0100,k=2,k kk是左移的位数,这里k = 2 k=2k=2

>>右移

各二进位全部右移若干位,对无符号数,高位补0,有符号数,右移补1 11。

0100>>k=0001,k=2,k kk是右移的位数,这里k = 2 k=2k=2

2、位运算的性质

2.1 运算符的优先级

优先级需要弄清楚,如果不太清楚可以加小括号确保是想要的运算顺序,这里只是相对优先级,即只是和一些常用的算术运算符做比较。

2.2 位运算符的运算律

3、位运算高级操作

如下表,请读者认真阅读理解,在阅读的过程中可以对示例进行运算。

当然,这里只是一些常用的,并不是全部,位运算的神奇远不止于此。

4、负数的位运算 

首先,我们要知道,在计算机中,运算是使用的二进制补码,而正数的补码是它本身,负数的补码则是符号位不变,其余按位取反,最后再+ 1 +1+1得到的, 例如:

15 1515,原码:00001111   00001111\space00001111 补码:00001111 0000111100001111

− 15 -15−15,原码:10001111   10001111\space10001111 补码:11110001 1111000111110001

那么对于负数的位运算而言,它们的操作都是建立在补码上的,得到的运算结果是补码,最后将补码结果转化成一个普通的十进制数结果。
但需要注意的是,对于有符号数的右移操作,不同的处理器架构可能有不同的规定。在某些架构中(如x86),如果对有符号数执行算术右移(arithmetic right shift),则高位空出来的位置会补上符号位;对于无符号数的右移操作,所有架构都遵循相同的规则:高位空出来的位置会补0。例如对于− 15 -15−15,其补码为11110001 , 11110001,11110001,右移一位( − 15 > > 1 ) (-15>>1)(−15>>1)得到的是11111000 1111100011111000,即− 8 -8−8,其他的同理。
在大多数现代处理器上,无论是有符号数还是无符号数,左移操作总是将空出来的低位补0。

这里我们介绍几个特殊的性质:

  • 快速判断是否为-1

        在链式前向星中,我们初始化h e a d headhead数组为− 1 -1−1,最后判断是否遍历完u uu的所有边时,即判断i ii是否为− 1 -1−1,我们直接用∼ i \sim i∼i即可。原因就在于− 1 -1−1的补码是11111111 1111111111111111,按位取反就变为00000000 0000000000000000,这实际上就是0 00。

  • 取最低位的1,lowbit函数

        也就是x & ( − x ) x\&(-x)x&(−x),这在树状数组中起着巨大作用,这里指路一篇树状数组讲解b l o g blogblog:点这里,我们来证明一下,这里取x = 15 x=15x=15,对于15 & ( − 15 ) 15\&(-15)15&(−15),我们知道,在补码上进行运算得到的是00000001 0000000100000001,需要注意二元运算的符号位我们需要进行运算。

位运算的运用

1、判断第i位是否为0

2、将第i位设置为1

3、统计有多少个1 

int count(int x){
    int cnt = 0;
    while(x){
        x = x & (x - 1);
        cnt ++;
    }
    return cnt;
}

对于任意的x xx,转换成二进制后,是形如这样的数字:a a . . . a a 10...00 aa...aa10...00aa...aa10...00,从右向左数有任意多个0 00,直到遇见第一个1 11,字母a aa用来占位,代表1 11左边的任意数字。x − 1 x-1x−1转换成二进制后,是形如这样的数字:a a . . . a a 01...11 aa...aa01...11aa...aa01...11,从右向左数,原来的任意多个0 00都变成1 11,原来的第一个1 11,变成0 00,字母a aa部分不变。对x xx 和 x − 1 x-1x−1 进行 按位与 计算,会得到:a a . . . a a 00...00 aa...aa00...00aa...aa00...00,从右向左数,原来的第一个1 11变成了0 00,字母a部分不变。所以 x & ( x − 1 ) x \& (x-1)x&(x−1)相当于消除了 x xx 从右向左数遇到的第一个1 11。那么,x xx转换成二进制后包含多少个1 11,count函数里的循环就会进行多少次,直到x xx所有的1 11都被“消除”。

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

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

相关文章

J-STAGE (日本电子科学与技术信息集成)数据库介绍及文献下载

J-STAGE (日本电子科学与技术信息集成)是日本学术出版物的平台。它由日本科学技术振兴机构&#xff08;JST&#xff09;开发和管理。该系统不仅包括期刊&#xff0c;还有论文集&#xff0c;研究报告、技术报告等。文献多为英文&#xff0c;少数为日文。目前网站上所发布的内容来…

通过windows远程桌面,远程连接CentOS系统

1.配置阿里云的YUM仓库 1.1 备份当前的YUM仓库配置文件 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2 下载阿里云的CentOS仓库配置文件 对于CentOS 7&#xff1a; sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirr…

Java RMI反序列化总结篇-01

1.java rmi反序列化 RMI 允许一个应用程序访问另外一个服务器或虚拟机上的对象&#xff0c;方法和服务&#xff0c;它使远程方法调用就像在本地调用一样简单。它为用户屏蔽了底层的网络传输细节&#xff0c;使用的时候只需适当处理异常即可。所以 RMI 是非常容易使用的&#x…

uniapp开发安卓app使用文字转语音技术

在 UniApp 开发安卓应用时&#xff0c;要实现文字转语音&#xff08;Text-to-Speech, TTS&#xff09;技术&#xff0c;你可以利用 UniApp 的跨平台能力结合原生模块或第三方服务来实现。以下是一些建议的步骤和方法&#xff1a; 1. 使用 UniApp 原生模块&#xff08;如果支持…

Linux中的磁盘分析工具ncdu

2024年5月14日&#xff0c;周二上午 概述 ncdu 是一个基于文本的用户界面磁盘使用情况分析工具。它可以在终端中快速扫描目录&#xff0c;并统计该目录下的文件和文件夹的磁盘使用情况&#xff0c;以交互友好的方式呈现给用户。 安装 在 Debian/Ubuntu 系统下&#xff0c;可…

Linux的命名管道 共享内存 信号量

目录 命名管道 mkfifo函数 unlink函数 命名管道类 服务端 客户端 共享内存 shmget函数 ftok函数 key和shmid的区别 snprintf函数 ipcs指令 ipcrm指令 shmctl函数 shmat函数 void*做返回值 创建共享内存空间 服务端 客户端 信号量 命名管道 基本概念&a…

Unity使用sherpa-onnx实现离线语音合成

sherpa-onnx https://github.com/k2-fsa/sherpa-onnx 相关dll和lib库拷进Unity&#xff0c;官方示例代码稍作修改 using SherpaOnnx; using System; using System.IO; using System.Runtime.InteropServices; using UnityEngine;public class TTS : MonoBehaviour {public st…

基于java 自定义注解Annotation设计简单ORM框架——进阶篇

目录 引言实例新建两个注解标注实体类拼接sql语句 总结 引言 一般Java规范编程&#xff08;只是一种习惯&#xff0c;而不是强制&#xff09;中&#xff0c;变量的命名方式一般采用驼峰式命名。比如userName&#xff0c;userImage。但是在数据库中一般不会采用驼峰式&#xff…

工业物联网解决方案:机房动环监控系统

工业物联网解决方案&#xff1a;机房动环监控系统 工业物联网&#xff08;IIoT&#xff09;作为数字化转型的关键驱动力&#xff0c;正深刻改变着各行各业的运作模式&#xff0c;其中机房动环监控系统是实现智能化运维管理的重要组成部分。该系统通过集成传感器技术、大数据分…

位图(c++)

文章目录 1.位图概念2.位图的实现3.应用&#xff08;解决整形存在或次数问题&#xff09;3.1存在问题3.2次数问题 5.搜索的方法对比&#xff1a; 1.位图概念 和哈希一样&#xff0c;都是一个表来记录某个元素的个数或者存在与否&#xff1b;不同的是哈希使用的计算机定义的完整…

跨境必看|TikTok账号运营的八大秘籍

国内的传统生意都是可以在抖音上做&#xff0c;那么也可以在TikTok 上重新做一遍。那该如何才能把握住这片巨大的蓝海&#xff0c;TikTok 账号的运营就成为了主要的关键了&#xff0c;对于TikTok账号运营的八大秘籍&#xff0c;大家一起看看是如何做的&#xff1f; 一、固定节…

部署管理征信链码

一 . 链码准备 需要删除上面后面标记的文件&#xff0c;之后拖入 二. 打包链码 注意需要先启动链 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/credit_chaincode --lang n…

VMware虚拟机安装详细教程

VMware下载安装好后&#xff0c;下载好我们要安装的操作系统的镜像文件后&#xff0c;此处安装的为centos7版本&#xff0c;就可以开始安装了。 1点击下一步 image 2、勾选【我接受条件款协议中的条款】&#xff0c;然后点击【下一步】。 image 3、取消勾选&#xff0c;然后点…

【瑞萨RA6M3】1. 基于 vscode 搭建开发环境(后续)

编译 mkdir build cd build cmake .. -G"Unix Makefiles" make -j或者 cmake -Bbuild -G"Unix Makefiles" cmake --build build创建快捷指令&#xff1a; 删除 .vscode/tasks.json&#xff0c; 存储占用和生成 MAP 编译完成后&#xff0c;打印内存占用…

大数据可视化实验(五):Tableau数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;打开数据源... 1 2&#xff09;进入工作簿... 2 3&#xff09;字段设置... 2 4&#xff09;数据筛选... 3 5&#xff09;绘制条形图... 3 四、思考问题... 4 五、总结与心得体会... 4 一、…

04-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容 上一节《03-单片机商业项目编程&#xff0c;从零搭建低功耗系统设计-CSDN博客》我们确定了设计思路&#xff0c;并如何更有效的保持低功耗&#xff0c;这节我们就准备来做软件框架设计。在AI飞速发展的时代&#xff0c;我们也会利AI来辅助我们完成&#xff0c;让自…

【Image captioning】In Defense of Grid Features for Visual Question Answering实现流程

In Defense of Grid Features for Visual Question Answering实现流程 网格特征预训练代码 这是该论文的特征预训练代码发布: @InProceedings{jiang2020defense,title={In Defense of Grid Features for Visual Question Answering},author={Jiang, Huaizu and Misra, Ishan…

机器学习实战宝典:用scikit-learn打造智能应用

书接上文——《数据探险家的终极指南&#xff1a;用Python挖掘机器学习的奥秘》 前文我们在这段精彩的机器学习探险之旅中&#xff0c;从基础概念出发&#xff0c;深入探索了使用Python和scikit-learn库进行数据分析和模型构建的全过程。 我们首先了解了机器学习的基本原理&am…

通义千问 1.5 -7B fine-tune验证

尝试对对中文数据进行finetune验证&#xff0c;测试模型的可优化方向。下面是代码的详细情况 代码实现 from datasets import load_dataset from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,AutoTokenizer,TrainingArgum…

hadoop学习---基于Hive的数据仓库相关函数机制及其优化方案

Hive相关函数&#xff08;部分&#xff09;&#xff1a; if函数: 作用: 用于进行逻辑判断操作 语法: if(条件, true返回信息,false返回信息) 注意: if函数支持嵌套使用 select if(aa,’bbbb’,111) fromlxw_dual; bbbb select if(1<2,100,200) fromlxw_dual; 200nvl函数:…