二进制和位运算

二进制

二进制是一种数值系统,仅使用两个数字: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.xdnf.cn/news/147981.html

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

相关文章

英特尔AI加速器Gaudi 3下周发布,挑战NVIDIA统治地位!

英特尔正稳步推进其2024年计划&#xff0c;备受瞩目的AI加速器Gaudi3预计将于下周震撼登场。这款被誉为英特尔AI英雄的产品&#xff0c;专注于处理大规模训练和推理任务&#xff0c;拥有无与伦比的扩展能力。面对市场对高效能半导体的旺盛需求&#xff0c;英特尔首席执行官帕特…

FX5 CPU模块和以太网模块的以太网通信功能

FX5 CPU模块和以太网模块的以太网通信功能的概要如下所示。 CPU模块的内置以太网端口的通信规格如下所示。 1、与MELSOFT的直接连接 不使用集线器&#xff0c;用1根以太网电缆直接连接以太网搭载模块与工程工具(GX Torks3)。无需设定IP地址&#xff0c;仅连接目标指定即可进行…

无服务器计算构建人工智能管理区块链系统

图片发自简书App 图片发自简书App 本发明属于网络版权管理技术领域&#xff0c;特别涉及一种以交易信息作 为唯一标准发行虚拟币的区块链系统。 背景技术 数字代币如比特币、以太坊等是区块链技术的实现方式之一&#xff0c;目 标是取代法定货币流通&#xff0c;通过“挖矿”的…

前端-js例子:收钱转账

支付宝转账 在这里用到周期定时器setInterval(function,time)&#xff0c;设置达到目标钱数时停止定时器。 点击转账按钮时&#xff0c;开始函数显示。 同时要确定输入框里输入的是数字。&#xff08;有一定容错&#xff09; window.onloadfunction(){var btn document.que…

什么是慢充优惠话费充值api?如何选择平台

一、话费充值api的定义 话费充值api是一种能够让开发者将话费充值功能集成到自己的平台的接口。通过接入话费充值api接口&#xff0c;就能够实现话费充值平台的搭建&#xff0c;从而为用户提供话费充值服务&#xff0c;这一接口主要适用于对话费充值有长期稳定需求的企业或者商…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

排序-----归并排序(递归版)

核心思想&#xff1a;假设数组前后两部分各自有序&#xff0c;然后各定义两个指针&#xff0c;谁小谁放到新开辟的数组里面&#xff0c;最后把新开辟的数组赋值给原数组就完成了。要使前后两部分有序就采用递归的方式&#xff0c;不断往下划分块&#xff0c;最后一层划分为两个…

01 基础request

目录 类 WxRequest 的定义 静态属性 default 构造函数 constructor 方法 request HTTP 方法封装 创建 WxRequest 实例并导出 完整代码&#xff1a; 类 WxRequest 的定义 创建一个 WxRequest 类包含一个静态属性 default 和几个方法&#xff0c;用于处理网络请求。 静态…

【后端开发】JavaEE初阶—Theard类及常见方法—线程的操作(超详解)

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解多线程的知识哟~~~&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【后端开发】JavaEE初阶—线程的理解和编程实现-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondl…

计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

鸿蒙OpenHarmony【轻量系统内核扩展组件(CPU占用率)】子系统开发

基本概念 CPU&#xff08;中央处理器&#xff0c;Central Processing Unit&#xff09;占用率分为系统CPU占用率和任务CPU占用率。 系统CPU占用率&#xff1a;是指周期时间内系统的CPU占用率&#xff0c;用于表示系统一段时间内的闲忙程度&#xff0c;也表示CPU的负载情况。系…

INIT与init_array

INIT与init array 1.so执行JNI_OnLoad之前&#xff0c;还会执行俩个构造函数init 和init array 在so加载时候有这个过程&#xff1a; .init -> .init array -> JNI_Onload -> java_com_xxx 在脱壳的过程中会在一些系统级的.so中下断点比如&#xff1a;fopen&#x…

GUI编程19:贪吃蛇小游戏及GUI总结

视频链接&#xff1a;21、贪吃蛇之界面绘制_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p21&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.游戏中用的的图片素材 1.贪吃蛇游戏的主启动类StartGame&#xff1b; package com.yundait.snake;import j…

缓存的思考与总结

缓存的思考与总结 什么是缓存缓存命中率数据一致性旁路模式 Cache aside双写模式直写模式 write through异步写 Write Behind 旁路和双写 案例 新技术或中间的引入&#xff0c;一定是解决了亟待解决的问题或是显著提升了系统性能&#xff0c;并且这种改变所带来的增幅&#xff…

【开源服务框架】Dubbo

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Java面试中开源服务框架Dubbo会涉及到的知识点 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一…

GAMES101(15节)

Irradiance辐射度量学 辐射度量学在渲染领域&#xff0c;可以帮助理解基于物理的光照模型 radiant energy辐射能量Q&#xff0c;累计总能量&#xff08;单位J joule焦耳&#xff09;&#xff0c;就像太阳能板&#xff0c;光照时间越长接收能量越多&#xff0c;收到的能量总和…

jetlinks物联网平台学习2(加盐算法登陆)

加盐算法 加盐算法加密验证密码是否正确 对于传统的MD5加密&#xff0c;比更传统的直接保存账号密码稍微安全一点。 md5加密是一种hash算法 比如对于123456来说&#xff0c;md5算法结果一定是e10adc3949ba59abbe56e057f20f883e 这个结果是固定的。于是有的人准备一张彩虹表 预先…

ECharts基础使用方法 ---vue

1.安装依赖文件 仔细看项目" README.md " 描述&#xff0c;确定用什么安装 npm npm install echarts --save //官网推荐使用 pnpm pnpm install echarts --save 其他也是 在项目根目录&#xff0c;打开当前目录命令控制栏&#xff0c;输入以上命令并运行 安装成功后…

第十三章:使用html和css做一个静态登录网页练习

我们在使用浏览器 浏览某些网站的时候 有可能会遇到登录这种网页,这种网页是怎么制作出来的呢? 下面 我就来分享一个简单的 登录页 实现方案! 登录页面的作用: 身份验证:登录页面的核心作用就是验证用户身份。用户输入用户名(或邮箱、手机号)和密码,系统通过验证来判断…