算法-二进制和位运算
一.二进制
(1).无符号数:
无符号数是一种数据表示方式,它只表示非负整数,即没有符号位,所有的位都用来表示数值大小。在 C++ 等编程语言中,常见的无符号类型有 unsigned int
、unsigned char
等。例如,一个 8 位的无符号整数 unsigned char
可以表示范围为 0
到 255
的整数,而不像有符号的 char
可以表示 -128
到 127
的范围。
对于一个无符号整数,可以使用除 2 取余法手动将其转换为二进制表示。以下是一个简单的 C++ 示例:
#include <iostream>
#include <string>std::string binaryRepresentation(unsigned int num) {std::string binaryStr;while (num > 0) {binaryStr = std::to_string(num % 2) + binaryStr;num /= 2;}return binaryStr;
}int main() {unsigned int num = 10;std::string binary = binaryRepresentation(num);std::cout << binary << std::endl; // 输出 "1010"return 0;
}
(2).有符号数:
计算机中一般利用补码表示法:
- 对于正数,其补码与原码相同。
- 对于负数,补码是在反码的基础上加 1。
- 例如,对于一个 8 位的有符号整数:
+5
的补码表示为00000101
(与原码相同)。-5
的补码- 表示为
11111011
(反码11111010
加 1)。
对于一个使用补码表示的有符号二进制数,将其转换为十进制数的步骤如下:
-
判断正负:
- 首先,观察补码的最高位(符号位)。如果最高位为
0
,则该数为正数,直接将补码转换为十进制即可。 - 如果最高位为
1
,则该数为负数,需要先将补码转换为原码,再将原码转换为十进制。
- 首先,观察补码的最高位(符号位)。如果最高位为
-
正数的转换(原码和补码相同):
- 对于正数,直接将二进制数按权展开求和,即从右到左用二进制位上的数字乘以 ( 从 开始,从右向左递增),然后将结果相加。
- 例如,对于 8 位补码表示的正数
01011010
,转换为十进制为:- 。
-
负数的转换(从补码到原码):
- 对于负数,先对补码取反(包括符号位),然后加 1,得到原码。
- 再将原码按权展开求和,最后加上负号。
- 例如,对于 8 位补码表示的负数
10101101
:- 先取反得到
01010010
。 - 再加 1 得到原码
01010011
。 - 转换为十进制为:-(0x27+1x2+0x25+1x24+0x23+0x22+1x21+1x2)=-83
- 先取反得到
二.位运算
位运算符是一种操作二进制位的运算符,它们直接对操作数的二进制表示进行操作。在大多数编程语言中,常见的位运算符包括:按位与(&
)、按位或(|
)、按位异或(^
)、按位取反(~
)、左移(<<
)和右移(>>
)。这些运算符通常用于对整数类型的数据进行操作,因为整数在计算机中是以二进制形式存储的。
(1)按位与&
- 按位与运算符
&
对两个操作数的每个二进制位进行逻辑与操作。如果两个相应的二进制位都为 1,则结果为 1;否则,结果为 0。 - 示例(C++):
-
#include <iostream> using namespace std;int main() {int a = 5; // 二进制表示为 0101int b = 3; // 二进制表示为 0011int result = a & b; // 结果为 0001,即十进制的 1cout << result << endl; // 输出 1return 0; }
(2)按位或|
-
- 按位或运算符
|
对两个操作数的每个二进制位进行逻辑或操作。如果两个相应的二进制位中至少有一个为 1,则结果为 1;否则,结果为 0。
- 按位或运算符
- 示例(C++):
-
#include <iostream> using namespace std;int main() {int a = 5; // 二进制表示为 0101int b = 3; // 二进制表示为 0011int result = a | b; // 结果为 0111,即十进制的 7cout << result << endl; // 输出 7return 0; }
(3)按位异或^
- 按位异或运算符
^
对两个操作数的每个二进制位进行逻辑异或操作。如果两个相应的二进制位不同,则结果为 1;如果相同,则结果为 0。 - 示例(C++):
-
#include <iostream> using namespace std;int main() {int a = 5; // 二进制表示为 0101int b = 3; // 二进制表示为 0011int result = a ^ b; // 结果为 0110,即十进制的 6cout << result << endl; // 输出 6 }
(4).按位取反~
-
- 按位取反运算符
~
对操作数的每个二进制位取反,即 0 变为 1,1 变为 0。
- 按位取反运算符
- 示例(C++):
-
#include <iostream> using namespace std;int main() {int a = 5; // 二进制表示为 0101int result = ~a; // 结果为 1010,即十进制的 -6cout << result << endl; // 输出 -6return 0; }
(5)左移<<
- 功能:
- 左移运算符
<<
将左操作数的二进制表示向左移动右操作数指定的位数。右侧空出的位用 0 填充。
- 左移运算符
- 示例(C++):
-
#include <iostream> using namespace std;int main() {int a = 5; // 二进制表示为 0101int result = a << 2; // 结果为 010100,即十进制的 20cout << result << endl; // 输出 20return 0; }
(6)右移>>
- 功能:
- 右移运算符
>>
将左操作数的二进制表示向右移动右操作数指定的位数。对于无符号整数,左侧空出的位用 0 填充;对于有符号整数,根据不同的编程语言和机器,可能用符号位填充(算术右移)或用 0 填充(逻辑右移)。
- 右移运算符
- 示例(C++):
-
#include <iostream> using namespace std;int main() {int a = 5; // 二进制表示为 0101int result = a >> 1; // 结果为 0010,即十进制的 2cout << result << endl; // 输出 2return 0; }
相关文章:
算法-二进制和位运算
一.二进制 (1).无符号数: 无符号数是一种数据表示方式,它只表示非负整数,即没有符号位,所有的位都用来表示数值大小。在 C 等编程语言中,常见的无符号类型有 unsigned int、unsigned char 等。…...

OpenAI Chatgpt 大语言模型
OpenAI 一个美国人工智能研究实验室,由非营利组织 OpenAI Inc,和其营利组织子公司 OpenAI LP 所组成。该组织于 2015 年由萨姆阿尔特曼、里德霍夫曼、杰西卡利文斯顿、伊隆马斯克、伊尔亚苏茨克维、沃伊切赫萨伦巴、彼得泰尔等人在旧金山成立࿰…...

SpringBoot【九】mybatis-plus之自定义sql零基础教学!
一、前言🔥 环境说明:Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE mybatis-plus的基本使用,前两期基本讲的差不多,够日常使用,但是有的小伙伴可能就会抱怨了,若是遇到业务逻辑比较复杂的sq…...

C#,人工智能,深度学习,目标检测,OpenCV级联分类器数据集的制作与《层级分类器一键生成器》源代码
一、目标识别技术概述 1、摘要 目标检测是计算机视觉中最基本和最具挑战性的问题之一,它试图从自然图像中的大量预定义类别中定位目标实例。深度学习技术已成为直接从数据中学习特征表示的强大策略,并在通用目标检测领域取得了显著突破。鉴于这一快速发…...
调度系统:Luigi 的主要特性和功能
Luigi 是一个开源的 Python 工作流管理工具,用于构建批处理作业管道,特别适用于数据工程领域。它被设计用来编排任务和处理任务间的依赖关系,支持自动化复杂的 ETL 流程、数据分析、模型训练等任务。 Luigi 的主要特性和功能: 任…...

C# 探险之旅:第二节 - 定义变量与变量赋值
欢迎再次踏上我们的C#学习之旅。今天,我们要聊一个超级重要又好玩的话题——定义变量与变量赋值。想象一下,你正站在一个魔法森林里,手里拿着一本空白的魔法书(其实就是你的代码编辑器),准备记录下各种神奇…...

AUTOSAR:SOME/IP 概念
文章目录 1. 用例与需求1.1 典型用例1.2 对中间件的要求 2. 协议栈示例3. SOME/IP 概念3.1 中间件整体功能与架构3.2 服务组成元素详细解释 4. 服务发现机制深入剖析5. 总结 1. 用例与需求 1.1 典型用例 信息娱乐系统: 后座娱乐系统连接:允许后排乘客连…...

循序渐进kubenetes Service(Cluster ip、Nodeport、Loadbalancer)
文章目录 部署一个web服务Kubernetes Port ForwardKubernetes ServicesClusterIP ServiceNodePort ServiceLoadBalancer Service 部署一个web服务 准备 Kubernetes 集群后,创建一个名为 web 的新 namespace,然后在该 namespace 中部署一个简单的 web 应…...

深入理解 Apache Shiro:安全框架全解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...

mac 安装CosyVoice (cpu版本)
CosyVoice 介绍 CosyVoice 是阿里研发的一个tts大模型 官方项目地址:https://github.com/FunAudioLLM/CosyVoice.git 下载项目(非官方) git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 进入项目 cd CosyVoic…...

币安移除铭文市场的深度解读:背后原因及其对区块链行业的影响
引言: 就在昨天,2024年12月10号,币安宣布将移除铭文市场(Inscriptions Market)。这一消息引发了全球加密货币社区的广泛关注,尤其是在比特币NFT和数字收藏品市场快速发展的背景下。铭文市场自诞生以来迅速…...

深度学习实战野生动物识别
本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对野生动物数据集进行训练和优化,该数据集包含丰富的野生动物图像样…...
windows安装使用conda
在Windows系统上安装和使用Conda的详细步骤如下: 一、下载Conda安装包 访问Conda的官方网站Anaconda | The Operating System for AI,点击“Downloads”按钮。在下载页面,选择适合您系统的安装包。通常,对于Windows系统…...

手机租赁系统开发全流程解析与实用指南
内容概要 在如今快速发展的科技时代,手机租赁系统已经成为一种新兴的商业模式,非常符合当下市场需求。那么,在开发这样一个系统的时候,首先要从需求分析和市场调研开始。在这一阶段,你需要了解用户需要什么࿰…...
SpringBoot 开发—— YAML文件深度分析
文章目录 一、YAML概述二、数据表示三、YAML 的语法四、YAML 的应用五、YAML 与其他格式的比较1、YAML vs .properties文件可读性和结构数据类型支持扩展性和灵活性使用场景性能和支持2、YAML vs. JSON3、YAML vs. XML六、使用 YAML 的注意事项七、总结YAML 是非常流行的一种配…...

复合机器人整体解决方案
复合机器人是一种集成移动机器人和协作机器人两项功能为一身的新型机器人,更符合人们想象中“脑、眼、手、脚”融合的机器人终极形态。复合机器人的整体解决方案通常涉及多个方面,包括机器人本体、控制系统、感知系统、执行系统以及周边配套设备等。以下…...
【Oracle11g SQL详解】日期和时间函数:SYSDATE、TO_DATE、TO_CHAR 等
日期和时间函数:SYSDATE、TO_DATE、TO_CHAR 等 在 Oracle 数据库中,日期和时间函数用于处理日期和时间数据。它们在记录创建时间、分析时间间隔、格式化输出等场景中非常重要。本文将详细讲解常用的日期和时间函数及其应用。 一、SYSDATE:获…...

VSCode设置字体
参考文章:【面向小白】vscode最佳实践(2)—— 字体设置(fira code更纱黑体),这篇文章末尾给了安装字体的链接。 配置的字体还是很好看的。 ‘Fira Code Retina’, ‘Sarasa Mono Sc’ 需要注意的一个点&am…...

shell编程入门之提取字符并设置rtc时间
awk用法 awk是一款文本处理工具,通常在Unix和Linux操作系统中使用,用于以行为单位对文本进行处理和操作。它可以读取输入文本,对其进行处理,生成报表、统计信息等,并将结果输出到标准输出设备中。 它主要有以下特点&…...
react 不可变数据更新(Immutable Update)合并对象 类似与Java 的BeanUtils.copyProperties
{ ...state, // 保留原有的 state 的其他部分data: { ...state.data, // 保留 state.data 中的其他字段...action.payload // 使用 action.payload 覆盖 state.data 中需要更新的字段} }这段代码是 Redux 中常见的一种状态更…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...