当前位置: 首页 > 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…...

Java 面试 - Redis

Redis Redis 是基于键值对的非关系型数据库。Redis 拥有string、hash、list、set、zset等多种数据结构, redis具有惊人的读写性能, 其优秀的持久化机制是的它在断电和机械故障时也不会发生数据丢失, 可以用于热点数据存放, 还提供了键过期、发布订阅、食物、流水线、LUA脚本等多…...

【Go 基础篇】Go语言结构体之间的转换与映射

在Go语言中&#xff0c;结构体是一种强大的数据类型&#xff0c;用于定义和组织不同类型的数据字段。当我们处理复杂的数据逻辑时&#xff0c;常常需要在不同的结构体之间进行转换和映射&#xff0c;以便实现数据的转移和处理。本文将深入探讨Go语言中结构体之间的转换和映射技…...

Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)

多线程案例 一、设计模式&#xff08;单例模式工厂模式&#xff09;1、单例模式2、工厂模式 二、阻塞式队列1、生产者消费者模型2、阻塞对列在生产者消费者之间的作用3、用标准库阻塞队列实现生产者消费者模型4、模拟实现阻塞队列 三、定时器1、标准库中的定时器2、模拟实现定时…...

将 ordinals 与 比特币智能合约集成 : 第 1 部分

将序数与比特币智能合约集成&#xff1a;第 1 部分 最近&#xff0c;比特币序数在区块链领域引起了广泛关注。 据称&#xff0c;与以太坊 ERC-721 等其他代币标准相比&#xff0c;Ordinals 的一个主要缺点是缺乏对智能合约的支持。 我们展示了如何向 Ordinals 添加智能合约功…...

【USRP】集成化仪器系列1 :信号源,基于labview实现

USRP 信号源 1、设备IP地址&#xff1a;默认为192.168.10.2&#xff0c;请勿 修改&#xff0c;运行阶段无法修改。 2、天线输出端口是TX1&#xff0c;请勿修改。 3、通道&#xff1a;0 对应RF A、1 对应 RF B&#xff0c;运行 阶段无法修改。 4、中心频率&#xff1a;当需要…...

串行协议——USB驱动[基础]

多年前的学习记录&#xff0c;整理整理。 一、USB协议基础 二、Linux内核USB驱动源码分析 USB中不同类型设备使用的 设备描述符(设备类\设备子类\设备协议) 配置不同,典型的以下几种:1)HID设备: Human Input Device人工输入设备, 如鼠标\键盘\游戏手柄等.2)CDC设备: Communi…...

健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评

健康舒适的超满意照明体验&#xff01;SUKER书客SKY护眼台灯测评 2022年全国儿童青少年总体近视率为53.6%&#xff0c;其中6岁儿童为14.5%&#xff0c;小学生为36%&#xff0c;初中生为71.6%&#xff0c;高中生为81%&#xff0c;近视已成为当下人们遇到的比较普遍的眼健康问题…...

PID 算法

1.1 概述 比例&#xff08;Proportion&#xff09;积分&#xff08;Integral&#xff09;微分&#xff08;Differential&#xff09;控制器&#xff08;PID控制器或三项控制器&#xff09;是一种采用反馈的控制回路机制&#xff0c;广泛应用于工业控制系统和需要连续调制控制的…...

13.Redis 事务

Redis 事务 redis 事务事务操作multi 开启事务exec 执行事务discard 放弃当前事务watchunwatch redis 事务 Redis 的事务和 MySQL 的事务概念上是类似的。 都是把⼀系列操作绑定成⼀组。 让这⼀组能够批量执⾏。 Redis 的事务和 MySQL 事务的区别: 弱化的原⼦性: 这里指的是 …...

李宏毅机器学习课程笔记(更新ing)

CNN 为什么AlphaGo可以用CNN&#xff1f;棋盘抽象成图片时需要注意什么&#xff1f; 首先图片有两个特点&#xff1a; 1&#xff0c;只观察局部就可以显示某种pattern&#xff0c;比如要得出一个鸟嘴的结论&#xff0c;只需要观察局部图片 2&#xff0c;某种pattern可以出现在图…...

免费百度网站建设/深圳网站设计公司哪家好

昨天&#xff0c;终于开题了&#xff0c;也终于通过了&#xff01;可是心情却有点沉重&#xff01;可以说开题这段时间&#xff0c;我是在自己的方向上花了很大功夫的&#xff0c;大部分时间我都拿来阅读论文&#xff0c;整理思路。可是心里总是七上八下的&#xff0c;不踏实&a…...

建立网站 域名 服务器吗/全球搜索大全

据相关数据统计&#xff0c;中国中小学生&#xff0c;每天课外写作业的时间长达2.82小时&#xff01;是日本学生的3.7倍、韩国学生的4.8倍。尽管如此&#xff0c;80%的孩子在学习过程中&#xff0c;还都伴有歪歪斜斜、埋头苦干等不正确的姿势。那么&#xff0c;不正确的坐姿对孩…...

刷网站排名怎么刷/爱站网使用体验

上篇&#xff1a;第2章 大数据 Kafka集群部署 KafKa核心组成 1、 Kafka生产过程分析 1.1、 写入方式 producer采用推&#xff08;push&#xff09;模式将消息发布到broker&#xff0c;每条消息都被追加&#xff08;append&#xff09;到分区&#xff08;patition&#xff09;…...

网页上做网会员网站备案怎么写/品牌营销咨询公司

今天想用ajax和cookie做个自动登录&#xff0c;结果出现很多错误&#xff0c;特在此记录下 一开始我没用cookie是这样的 <input id"log-name" type"text" name"username" placeholder"请输入用户名" οnfοcus"this.placeho…...

深圳贷款网站建设/临沂google推广

最近项目需要在研究视频实时监控功能。 第一个需要了解的就是 H.264 格式&#xff0c;先以 H.264 文件为例进行数据分析。 在网上下载了 foreman.264 文件&#xff0c;进行了帧类型的分析和帧数据的分析。然后对比实际项目视频的需要&#xff0c;大概分析了一下数据传输的可能性…...

wordpress增加标签/百度移动排名优化软件

佳能lbp2900打印机驱动是佳能LBP-2900黑白激光打印机的官方最新驱动程序。佳能lbp2900打印机驱动Win2000/XP/Win7操作系统的安装。这款驱动是佳能LBP-2900黑白激光打印机必备的驱动程序&#xff0c;如果没有安装该驱动你就无法正常使用打印机也无法被电脑识别该设备。推荐有需要…...