二进制和位运算

二进制

二进制是一种数值系统,仅使用两个数字:0 和 1。它是计算机和数字系统的基础,因为计算机使用二进制来表示和处理数据。在二进制中,每个位置代表一个权重,类似于十进制系统中的位置,但权重是 2 的幂次方。
例如,二进制数 1011 可以转换为十进制数如下:
1 × 2^3 = 8
0 × 2^2 = 0
1 × 2^1 = 2
1 × 2^0 = 1
将它们相加:8 + 0 + 2 + 1 = 11,因此二进制 1011 对应的十进制是 11。

C++. 无符号整数(unsigned)

无符号整数只使用二进制数表示非负数,因此所有的位都用于表示数值本身。
存储方式:直接使用二进制表示数值。
范围:unsigned int(假设为 32 位系统)范围是 0 到 2^32-1。(int 32位,long long 64位)
例子:
8 位无符号数 0000 0101 表示十进制的 5
8 位无符号数 1111 1111 表示十进制的 255

C++ 有符号整数(signed)

有符号整数使用最高位(称为符号位)表示正负号。通常,C++ 使用 补码(Two’s Complement)表示负数。
存储方式:
最高位是符号位:0 表示正数,1 表示负数。
正数和无符号数的存储方式相同。
负数通过取该数绝对值的补码来表示。
补码计算:
取反(即将每个位变为相反的值,0 变 1,1 变 0),然后加 1。
例子:
7二进制为(为了方便我们用4位表示)0111
取反:1000
加1:1001这个就是-7

假如我们知道一个负数的二进制怎么知道它是负几?先减1,然后再取反
例子:
1000
减1:0111
取反:1000(这个1000就是数值8)所以这个复数就是-8
8和-8的二进制是不同的我们用八位来分别表示:
8的二进制为0000 1000
-8的二进制为1111 1000

范围:int(假设为 32 位系统)范围是 (-2)^31-1到 2^31-1 即 -2147483648 到 2147483647。
例子:
8 位有符号数 0000 0101 表示十进制的 5。
8 位有符号数 1111 1111 表示十进制的 -1(补码表示)。
8 位有符号数 1111 1011 表示十进制的 -5:
原始数是 0000 0101(即 5),取反得到 1111 1010,加 1 得到 1111 1011。
3. 存储上的差异
无符号整数所有位都用于表示数值,范围更大。而有符号整数使用最高位表示符号,实际能表示的正整数范围比无符号整数小一半。
例子对比(8位整数):
无符号:
0000 0000 表示 0。
1111 1111 表示 255。
有符号:
0000 0000 表示 0。
0111 1111 表示 127(最大正数)。
1000 0000 表示 -128(最小负数)。
1111 1111 表示 -1。

我们可以使用C++的bitset来写一个求一个int类型的二进制

bitset是 C++ 标准库中的一个模板类,用于表示和操作固定大小的位序列。它允许你高效地存储、操作和访问二进制位,常用于处理二进制数据、布尔数组或位掩码。

代码如下:
#include <iostream>
#include <bitset>
using namespace std;
void printBinary(int num) {// 使用bitset 直接输出 32 位二进制bitset<32> binary(num);cout << binary << endl;
}
int main() {int num;// 输入一个整数cout << "请输入一个整数:";cin >> num;// 输出该整数的32位二进制表示cout << "该整数的32位二进制表示为:";printBinary(num);return 0;
}

位运算

位运算的优先级低于算术运算符(除了取反),而按位与、按位或及异或低于比较运算符,所以必要时要添加括号
|按位或和&按位与,它们与||逻辑或和&&逻辑与是不同的。

#include<iostream>
using namespace std;
int main()
{//1. 按位与( & )//按位与运算符对两个二进制数的每一位进行与运算,只有对应位都为1时,结果才为1,否则为0。int a1 = 5;  // 0101int b1 = 3;  // 0011int result1 = a1 & b1;  // 结果为 0001, 即 1cout << result1 << endl;//2. 按位或( | )//按位或运算符对两个二进制数的每一位进行或运算,只要有一位为1,结果就为1。int a2 = 5;  // 0101int b2 = 3;  // 0011int result2 = a2 | b2;  // 结果为 0111, 即 7cout << result2 << endl;//3. 按位异或( ^ )//按位异或运算符对两个二进制数的每一位进行异或运算,当对应位相同时,结果为0,位不同时,结果为1。int a3 = 5;  // 0101int b3 = 3;  // 0011int result3 = a3 ^ b3;  // 结果为 0110, 即 6cout << result3 << endl;//4. 按位取反(~)//按位取反运算符对一个二进制数的每一位进行取反操作,即0变为1,1变为0。对于有符号整数,结果使用补码表示。int a4 = 5;  // 0101int result4 = ~a4;  // 结果为 1010, 即 -6(按补码表示法)cout << result4 << endl;//5. 左移( << )//左移运算符将操作数的二进制位左移指定的位数,右侧用0填充。每左移一位,相当于乘以2。int a5 = 5;  // 0101int result5 = a5 << 1;  // 结果为 1010, 即 10cout << result5 << endl;//6. 右移( >> )//右移运算符将操作数的二进制位右移指定的位数,左侧根据符号位进行填充(对于无符号数,左侧填充0)。每右移一位,相当于除以2。int a6 = 5;  // 0101int result6 = a6 >> 1;  // 结果为 0010, 即 2cout << result6 << endl;return 0;
}

位运算的一些应用

1.因为位运算与二进制有关因此可以推广出许多与 2 的整数次幂有关的应用。

将一个数乘(除) 2 的非负整数次幂:

int mulPowerOfTwo(int n, int m) {  // 计算 n*(2^m)return n << m;
}
int divPowerOfTwo(int n, int m) {  // 计算 n/(2^m)return n >> m;
}

注:我们平常写的除法是向 0 取整,而这里的右移是向下取整(注意这里的区别),即当数大于等于 0 时两种方法等价,当数小于 0 时会有区别,如: -1 / 2 的值为 0 ,而 -1 >> 1 的值为 -1

2.取绝对值
int Abs(int n) {return (n ^ (n >> 31)) - (n >> 31);/* n>>31 取得 n 的符号,若 n 为正数,n>>31 等于 0,若 n 为负数,n>>31 等于 -1若 n 为正数 n^0=n, 数不变,若 n 为负数有 n^(-1)需要计算 n 和 -1 的补码,然后进行异或运算,结果 n 变号并且为 n 的绝对值减 1,再减去 -1 就是绝对值 */
}
3.获取一个数二进制的某一位:
// 获取 a 的第 b 位,最低位编号为 0
int getBit(int a, int b) { return (a >> b) & 1; }
4.将一个数二进制的某一位设置为 0:
// 将 a 的第 b 位设置为 0 ,最低位编号为 0
int unsetBit(int a, int b) { return a & ~(1 << b); }
5.将一个数二进制的某一位设置为 1:
// 将 a 的第 b 位设置为 1 ,最低位编号为 0
int setBit(int a, int b) { return a | (1 << b); }
6.将一个数二进制的某一位取反:
// 将 a 的第 b 位取反 ,最低位编号为 0
int flapBit(int a, int b) { return a ^ (1 << b); }
7.求n的第k位数字:
 n >> k & 1
8.返回n的最后一位1:
lowbit(n) = n & -n

参考资料
参考资料

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

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

相关文章

Linux:路径末尾加/和不加/的区别

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 普通文件操作 首先说明这个问题只会出现在目录和符号链接中&#xff0c;因为如果想要索引普通文件但却在路径末尾加/则会出现错误&#xff0c;如例1所示。 # 例1 zhang…

Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料

选择123云盘作为存储介质的原因 原因1&#xff1a; zotero个人免费空间大小&#xff1a;300M&#xff0c;如果zotero云端也保存文献pdf资料则远远不够 原因2&#xff1a; 百度网盘同步文件空间大小&#xff1a;1G123云盘同步文件空间大小&#xff1a;10G 第一台电脑实施步骤…

Hadoop的一些高频面试题 --- hdfs、mapreduce以及yarn的面试题

文章目录 一、HDFS1、Hadoop的三大组成部分2、本地模式和伪分布模式的区别是什么3、什么是HDFS4、如何单独启动namenode5、hdfs的写入流程6、hdfs的读取流程7、hdfs为什么不能存储小文件8、secondaryNameNode的运行原理9、hadoop集群启动后离开安全模式的条件10、hdfs集群的开机…

如何导入一个Vue并成功运行

注意1&#xff1a;要确保自己已经成功创建了一个Vue项目&#xff0c;创建项目教程在如何创建Vue项目 注意2&#xff1a;以下操作均在VS Code&#xff0c;教程在VS Code安装教程 一、Vue项目导入VS Code 1.点击文件&#xff0c;然后点击将文件添加到工作区 2. 选择自己的vue项…

有女朋友后,怎么养成贤内助?为自己找个好伴侣,为孩子找个好妈妈,为母亲找个好儿媳

有女朋友后&#xff0c;怎么养成贤内助&#xff1f;为自己找个好伴侣&#xff0c;为孩子找个好妈妈&#xff0c;为母亲找个好儿媳 时代背景女生有点作怎么办&#xff1f;大商家族的爱情观 时代背景 一块钱的东西&#xff0c;赋予俩块钱的意义&#xff0c;三块钱卖出去。 用商…

企业急于采用人工智能,忽视了安全强化

对主要云提供商基础设施上托管的资产的安全分析显示&#xff0c;许多公司为了急于构建和部署 AI 应用程序而打开安全漏洞。常见的发现包括对 AI 相关服务使用默认且可能不安全的设置、部署易受攻击的 AI 软件包以及不遵循安全强化指南。 这项分析由 Orca Security 的研究人员进…

Python爬虫使用实例-umei

优美图库 www.umei.cc BV1Ag41137re 1/获取资源 查看网站资源结构 多页&#xff0c;每个item只有一张图 多页&#xff0c;每个item都是一个图集 最大页码 内外层图集均有若干page。 通过尾页按钮确定pageNum&#xff1a; 2/发送请求 response requests.get(urlurl, header…

蓝桥杯【物联网】零基础到国奖之路:十. OLED

蓝桥杯【物联网】零基础到国奖之路:十.OLED 第一节 硬件解读第二节 MDK配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fa7660b81be9407aa19c603561553db0.png)第三节 代码 第一节 硬件解读 OLED硬件知识: 第二节 MDK配置 第三节 代码 include头文件。 编…

Vue3 中组件传递 + css 变量的组合

文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件&#xff0c;根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件&#xff1a; <Arrow color"red" />子组件&#xff1a; <template><div class&…

VM-Ubantu中使用vscode头文件报错——解决办法

问题 系统中头文件明明存在但是却报错 解决方法 在报错的文件中点击&#xff0c;shift ctrl p选择Edit Configurations(JSON) 修改文件内容 原文件内容 修改之后的内容 {"configurations": [{"name": "Linux","includePath":…

https加密原理

以为http的数据都是以明文传送&#xff0c;会有很大的安全问题&#xff0c;所以出现的https协议。https就是在http协议的基础上增加了一个安全层&#xff0c;可以对数据进行加密和解密(例如SSL、TLS等)。 https加密解密的原理&#xff1a;证书非对称加密对称加密 在讲解原理前…

你了解system V的ipc底层如何设计的吗?消息队列互相通信的原理是什么呢?是否经常将信号量和信号混淆呢?——问题详解

前言&#xff1a;本节主要讲解消息队列&#xff0c; 信号量的相关知识。 ——博主主要是以能够理解为目的进行讲解&#xff0c; 所以对于接口的使用或者底层原理很少涉及。 主要的讲解思路就是先讨论消息队列的原理&#xff0c; 提一下接口。 然后讲解ipc的设计——这个设计一些…

QT打包--windeployqt执行,运行程序提示缺少库

执行windeployqt.exe D:\Data\code\QtCode\Release\RegularExp\RegularExp.exe 生成相应的dll动态库 执行RegularExp.exe&#xff0c;出错&#xff1a;“由于找不到libgcc_s_seh-1.dll…” 找到安装的qt对应的libgcc_s_seh-1.dll拷贝到RegularExp.exe同级目录下&#xff0c; 执…

Qt 窗口事件机制

在 Qt 开发中&#xff0c;窗口的关闭、隐藏、显示等事件是常见且重要的功能。不同的事件触发条件、处理方式不同&#xff0c;了解和掌握这些事件有助于我们更好地控制窗口行为。本文将详细讲解这些事件的使用方法&#xff0c;并通过代码实例来展示其应用。 1. done(int r) — 关…

嵌入式C语言自我修养:GNU C编译器扩展语法精讲

在Linux内核的源码中&#xff0c;你会发现许多这样的“奇特”代码。它们看起来可能有点陌生&#xff0c;但它们实际上是C语言的一种扩展形式&#xff0c;这种扩展在C语言的标准教材中往往不会提及。这就是为什么你在阅读Linux驱动代码或内核源码时&#xff0c;可能会感到既熟悉…

写一下线性表

如果你是c语言, "不会"c, 那么... 把iostream当成stdio.h 把cout当成printf, 不用管啥类型, 变量名字一给输出完事 把cin>>当成scanf, 变量名字一给输入完事 把endl当成\n, 换行. 哦对了, malloc已经不建议使用了, 现在使用new, 把new当作malloc, 把delete当…

【工具变量】科技金融试点城市DID数据集(2000-2023年)

时间跨度&#xff1a;2000-2023年数据范围&#xff1a;286个地级市包含指标&#xff1a; year city treat post DID&#xff08;treat*post&#xff09; 样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff1a; 参考文献-pdf格式&#xff1a;https://…

【JVM】概述

前言 Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架&#xff08;如Spring、MyBatis等&#xff09;构成。在国内&#xff0c;有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富&…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘 在当今数字化时代背景下&#xff0c;短视频产业正经历前所未有的快速发展。其中&#xff0c;抖音凭借其创新的算法及多元内容生态获得巨大成功&#xff0c;吸引了众多用户。对于意欲进入短视频领域的创业者而言&…