当前位置: 首页 > news >正文

算法通关村第11关【青铜】| 位运算基础

1.数字在计算机中的表示

原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。

  1. 原码(Sign-Magnitude): 原码最简单,它的表示方式是用最高位表示符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,+5 的原码是 00000101,-5 的原码是 10000101。

  2. 反码(One's Complement): 反码表示方式在原码的基础上,负数的表示方式稍作修改。对于正数,反码与原码相同。对于负数,反码是将原码中的1变成0,0变成1。例如,+5 的反码仍然是 00000101,-5 的反码是 11111010。

  3. 补码(Two's Complement): 补码是计算机中最常用的表示方式。它也在原码的基础上稍作修改。对于正数,补码与原码相同。对于负数,补码是将原码中的1变成0,然后在最低位加1。例如,+5 的补码仍然是 00000101,-5 的补码是 11111011。

为什么需要反码和补码以及它们的优点

  • 解决0的表示问题: 在原码中,+0 和 -0 有不同的表示,这可能引起混淆。而在反码和补码中,+0 和 -0 都有相同的表示。

  • 简化加法运算: 使用补码可以简化加法运算,因为负数的补码加法可以与正数的加法一样进行,而不需要额外的规则。

  • 解决溢出问题: 补码在进行加法和减法时,能够自然地处理溢出。当结果超出表示范围时,溢出的位会被丢弃,而不会引发错误。

计算机是如何进行加减运算的

  • 加法运算: 在计算机中,加法运算通常使用补码来执行。两个数相加,首先将它们的补码相加,然后检查是否有溢出。如果有溢出,溢出的位将被丢弃。补码的加法可以简化为模运算,其中模是2的n次方,n 是数据类型的位数。结果可能会包含一个溢出标志位,用于指示运算是否溢出。

  • 减法运算: 减法运算也使用补码来执行。将被减数的补码与减数的补码相加,然后检查是否有溢出。同样,结果可能会包含一个溢出标志位。这种方式使加法和减法可以使用相同的硬件电路来执行,从而简化了计算机的设计。

原码、反码和补码是计算机中表示有符号整数的方式,它们在解决符号、0表示和溢出问题方面各具优势。补码通常是最常用的表示方式,因为它能够自然地处理加法和减法,并且不需要特殊的规则。

2.位运算规则

位运算是计算机中用于操作二进制位的一组操作符。这些操作符允许您直接操纵数字的二进制表示,通常用于执行一些特定的位级操作。以下是常见的位运算操作和规则:

(1)与、或、异或、取反

  1. 按位与(AND): 使用 & 操作符执行按位与操作。将两个数字的每个位都与对应位置的位进行比较,如果都为1,则结果位为1,否则为0。

    5 & 3 = 1
    // 5 的二进制表示:101
    // 3 的二进制表示:011
    // 按位与的结果:001
    
  2. 按位或(OR): 使用 | 操作符执行按位或操作。将两个数字的每个位都与对应位置的位进行比较,如果至少有一个为1,则结果位为1,否则为0。

    5 | 3 = 7
    // 5 的二进制表示:101
    // 3 的二进制表示:011
    // 按位或的结果:111
    
  3. 按位异或(XOR): 使用 ^ 操作符执行按位异或操作。将两个数字的每个位都与对应位置的位进行比较,如果两个位不同,则结果位为1,否则为0。

    5 ^ 3 = 6
    // 5 的二进制表示:101
    // 3 的二进制表示:011
    // 按位异或的结果:110
    
  4. 按位取反(NOT): 使用 ~ 操作符执行按位取反操作。将数字的每个位都翻转,0 变为1,1 变为0。

    ~5 = -6  // 注意:取反后可能是负数
    // 5 的二进制表示:101
    // 按位取反的结果:-110
    
  5. 左移(<<)和右移(>>): 使用 << 操作符执行左移操作,将数字的二进制表示向左移动指定的位数,右侧用0填充。使用 >> 操作符执行右移操作,将数字的二进制表示向右移动指定的位数,左侧用符号位(对于有符号数)或0填充。

    5 << 2 = 20
    // 5 的二进制表示:00000101
    // 左移2位的结果:00010100-5 >> 1 = -3
    // -5 的二进制表示:11111011
    // 右移1位的结果:11111101
    

(2)算术移位和逻辑移位

算术移位是一种将数字的二进制位向左或向右移动的操作,但与逻辑移位不同,它在向右移动时保留了符号位。对于正数,算术右移将在左侧填充0,而对于负数,算术右移将在左侧填充1,以保持负数的符号。

  • 算术右移:右侧填充0或1,取决于数字的符号。
  • 算术左移:左侧填充0。

例子:

正数 5 的二进制表示: 0000 0101

正数 5 的算术右移 1 位: 0000 0010(保留符号位0,右侧填充0)

负数 -5 的二进制表示: 1111 1011

负数 -5 的算术右移 1 位: 1111 1101(保留符号位1,右侧填充1)

逻辑移位(Logical Shift)

逻辑移位是一种将数字的二进制位向左或向右移动的操作,不考虑符号位。逻辑移位在向右或向左移动时都填充0。

  • 逻辑右移:右侧填充0。
  • 逻辑左移:左侧填充0。

例子:

正数 5 的二进制表示: 0000 0101

正数 5 的逻辑右移 1 位: 0000 0010

负数 -5 的二进制表示: 1111 1011

负数 -5 的逻辑右移 1 位: 0111 1101

总结:

  • 算术移位保留符号位并根据符号位进行填充,因此用于数学运算,如除法和乘法。
  • 逻辑移位不考虑符号位,始终填充0,通常用于位级操作和数据处理。

(3)位运算常用技巧

  1. 获取特定位的值:

    num = 42   # 二进制:101010
    bit_2 = (num >> 2) & 1  # 获取第2位的值
    print(bit_2)  # 输出 1
    
    获取第n位的值:使用右移和按位与操作 ((num >> n) & 1)。这将把第n位的值提取出来(0或1)。
  2. 设置特定位的值:

    设置第n位为1:使用按位或操作 num |= (1 << n)
  3. 清零特定位:

    清零第n位:使用按位与和取反操作 num &= ~(1 << n)
  4. 更新特定位的值:

    更新第n位的值为1或0:首先清零第n位,然后使用按位或操作设置新值。

这些技巧可以用于对二进制数据进行高效的位级操作,例如对寄存器或标志位进行处理,或者用于位图操作等。在实际编程中,它们通常用于优化性能、节省内存或执行特定的位级任务。

相关文章:

算法通关村第11关【青铜】| 位运算基础

1.数字在计算机中的表示 原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。 原码&#xff08;Sign-Magnitude&#xff09;&#xff1a; 原码最简单&#xff0c;它的表示方式是用最高位表示符号位&#xff0c;0表示…...

无涯教程-Android - RadioGroup函数

RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…...

降噪音频转录 Krisp: v1.40.7 Crack

主打人工智能降噪服务的初创公司「Krisp」近期宣布推出音频转录功能&#xff0c;能对电话和视频会议进行实时设备转录。该软件还整合的ChatGPT&#xff0c;以便快速总结内容&#xff0c;开放测试版于今天上线。 随着线上会议越来越频繁&#xff0c;会议转录已成为团队工作的重…...

基于React实现:弹窗组件与Promise的有机结合

背景 弹窗在现代应用中是最为常见的一种展示信息的形式&#xff0c;二次确认弹窗是其中最为经典的一种。当我们在React&#xff0c;Vue这种数据驱动视图的前端框架中渲染弹窗基本是固定的使用形式。 使用方式&#xff1a;创建新的弹窗组件&#xff0c;在需要弹窗的地方引用并…...

docker使用(一)生成,启动,更新(容器暂停,删除,再生成)

docker使用&#xff08;一&#xff09; 编写一个 Dockerfile构建镜像构建失败构建成功 运行镜像运行成功 修改代码后再次构建请不要直接进行构建&#xff0c;要将原有的旧容器删除或暂停停止成功删除成功再次构建且构建成功&#xff01; 要创建一个镜像&#xff0c;你可以按照以…...

用Qt自制一个小闹钟

小闹钟 功能 当按下启动按钮时&#xff0c;停止按钮可用&#xff0c;启动按钮不可用&#xff0c;闹钟无法设置&#xff0c;无法输入自定义内容 当按下停止按钮时&#xff0c;暂停播报&#xff0c;启动按钮可用&#xff0c;闹钟可以设置&#xff0c;可以输入自定义内容 .pro文…...

Vue2.0/Vue3.0使用xlsx+xlsx-style实现导出Excel文件

一、依赖导入 1、Vue2 Webpack构建的 npm i xlsx npm i xlsx-style npm i file-saver同时修改以下&#xff1a; 解决 Can’t resolve ‘./cptable’ in ‘…’ 的问题&#xff0c;在 vue.config.js 文件中加入该配置 module.exports {externals: {./cptable: var cptable}…...

【Kafka系列】(一)Kafka入门

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 Kafka是什么&#xff1f; 一句话概括&#xff1a;「Apache Kafka 是一款开源的消息引擎系统」 什么是消息引擎系统&#…...

外包干了2个月,技术退步明显了...

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年8月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

python实现语音识别

1. 首先安装依赖库 pip install playsound # 该库用于播放音频文件 pip install speech_recognition # 该库用于语音识别 pip install PocketSphinx # 语音识别模块中只有sphinx支持离线的&#xff0c;使用该模块需单独安装 pip install pyttsx3 # 该库用于将文本转换为语音播…...

java八股文面试[多线程]——线程的状态

5种状态一般是针对传统的线程状态来说&#xff08;操作系统层面&#xff09; 6种状态&#xff1a;Java中给线程准备的 NEW&#xff1a;Thread对象被创建出来了&#xff0c;但是还没有执行start方法。 RUNNABLE&#xff1a;Thread对象调用了start方法&#xff0c;就为RUNNABLE状…...

Go学习[合集]

文章目录 Go学习-Day1Go学习-Day2标识符变量基础语法字符串类型类型转换string和其他基本类型转换其他类型转stringstring转其他类型 指针类型运算符标准IO分支语句 Go学习-Day3循环语句函数声明init函数匿名函数闭包defer Go学习-Day4函数值传递&#xff0c;引用传递常用的函数…...

代码随想录算法训练营第42天 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

文章目录 前言一、01背包问题&#xff0c;你该了解这些&#xff01;二、01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组三、416. 分割等和子集总结 前言 01背包 一、01背包问题&#xff0c;你该了解这些&#xff01; 确定dp数组以及下标的含义 对于背包问题&#x…...

解决DNS服务器未响应错误的方法

​当你将设备连接到家庭网络或具有互联网接入功能的Wi-Fi热点时,由于各种原因,互联网连接可能无法正常工作。本文中的说明适用于Windows 10、Windows 8和Windows 7。 无法连接到DNS服务器的原因 故障的一类与域名系统有关,域名系统是世界各地互联网提供商使用的分布式名称…...

SpringBoot的HandlerInterceptor拦截器使用方法

一、创建拦截器 通过实现HandlerInterceptor接口创建自己要使用的拦截器 import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.…...

java 常用 jar 包

1 Lombok 是一个 java 类库&#xff0c;它利用注解方式自动生成 java bean 中 getter、setter、equals 等方法&#xff0c;还能自动生成 logger、toString、hashCode、builder 等 日志相关变量、Object 类方法或设计模式相关的方法&#xff0c;能够让你的 代码更简洁&#xff0…...

C#面试十问

1&#xff1a;C#中变量类型分为哪两种&#xff1f;它们的区别是什么&#xff1f;2&#xff1a;Class和Struct的区别&#xff1f;3&#xff1a;C#中类的修饰符和类成员的修饰符有哪些&#xff1f;4&#xff1a;面向对象的三个特征&#xff08;特点&#xff09;是什么&#xff1f…...

Day 41 动态规划part03 : 343. 整数拆分 96.不同的二叉搜索树

96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1…...

四轴飞行器的电池研究(MatlabSimulink仿真)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

准备HarmonyOS开发环境

引言 在开始 HarmonyOS 开发之前&#xff0c;需要准备好开发环境。本章将详细指导你如何安装 HarmonyOS SDK、配置开发环境、创建 HarmonyOS 项目。 目录 安装 HarmonyOS SDK 配置开发环境 创建 HarmonyOS 项目 总结 1. 安装 HarmonyOS SDK HarmonyOS SDK 是开发 Harmo…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...