算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出

article/2025/9/24 6:46:06

当你通过搜索逻辑,算术移位运算的时候,一直寻找资料,只不过可能你没有找到满意的回答,看到这,你大概率可以结束你的搜索过程了。

这里先说一句很重要的话:

  • 正数的原码,反码,补码三者相同。
  • 负数的反码就是该负数的绝对值(正数)的原码的所有位取反,负数的补码就是反码加一。
    如果你想了解反码,原码,补码的定义还有补码为什么要+1,为什么补码比原码多表示一个数的话,你可以看我的另一篇文章《原码、反码、补码的知识总结》,

1.算术左移-逻辑左移
他们都遵循:高位丢弃,低位补零。
对于一个数字:00110011
算术左移一位的话:01100110
逻辑左移一位的话:01100110

对于他们的数值变化,左移n位,他们的数值就变为原来的2^n倍,比如左移一位,移位后的数值变为原来的2倍。
比如:十进制的52,在二进制的表达是:00110011,算术或逻辑左移一位后变为:01100110,转化为十进制就是102。102/51=2,移位后的数值变为原来的2倍。
不过,这种数值变化关系只是适用于移位后被舍弃的所有高位里面没有1,不然的话,移位的过程就会有溢出。(以上的二进制表示的都是以原码形式的。)

2.算术右移-逻辑右移
对于有符号的数,一般编译器都是对其进行算术右移,而对无符号数,都是采用逻辑右移,为什么呢?无符号的是并没有符号位,怎么移动都是补零,算术右移没有意义。
例子1:11001100、01100110

逻辑右移:
对例子都进行逻辑右移一位,得01100110、00110011。只需要将数字往右移动一位,左边补上0就可以了。

算术右移
算术右移要保持符号位不变,左边所补上的数和符号位一样。对于有符号的数:最高位就是它的符号位,0表示正,1表示负。如果是对正数的右移的话,由于正数的原码和补码一样,所以你可以直接对原码进行移位操作,但是,如果你是对负数进行移位操作的话,由于一般负数都是以补码作为储存形式的,所以对负数的移位操作要对补码进行,而不是原码。

例子2:

数值 原码 补码1(原码除符号位取反后+1)
-4 1000 0100 1111 1100
向右移一位后,补码变为 1111 1110
补码2 原码(补码减1,除符号位,其他取反) 数值
1111 1110 1000 0010 -2

可见:对例子1和2进行算术右移一位,得11100110,00110011(符号位跟着一起移动并且左边补上了符号位。)。同样的,对于右移的数值变化,相当于除以2^n,n是移位的次数。如果移位的是一个奇数的话,一个奇数除以二,会出现小数,那么这时候移位的数值取小于这个带小数的数字的最大整数。
比如: 51/2 = 25.5,取小于25.5的最大正数就是25。

3.右移一位还有除二的区别。

通过上面你可能会把除以2和右移一位等价起来,其实两者的关系有点复杂,两者只是在某一些情况下才会相等,下面我开始详细的讲解一下他们两者的关系,如果赶时间的话,可以直接看我最后的总结;

大家可以自己编写程序,看看右移一位和除以二的数字有什么区别,为了避免遗漏数据,我把数据分成了 :正偶数 正奇数 零 负偶数 负奇数 。

这是我的草稿纸,在思维导图上分析了一下,懒得敲代码了:

下面是总结:

  1. n为非负数时,>> 1和 / 2的结果是一样的
  2. n为负数且还是偶数时,>> 1和/ 2的结果是一样的
  3. n为负数且还是奇数时,>> 1和/ 2的结果是不一样的

原因是奇数除二会发生截断现象。而>> 1和/ 2在n为负奇数时截断的反向不一样。
具体的说就是:
1.除以2的算术逻辑:类似于强制转化,比如-3 / 2 = -(int)1.5 = -1,这里就是把绝对值变小了,但是加了个负号,结果就变大了。
2.对于移位,由于负数就是采用补码储存的,而补码和原码是根据模弄出来的,具体看我的《原码、反码、补码的知识总结》,补码移位后舍去小数点,相当于补码变大,原码变小,-3 >> 1 = (1101) >> 1 = (1010) = -2,所以,负数的奇数除以2会比向右移动一位大1.

4.算术溢出:
对于算术或者右移,没有溢出的情况;但是对于左移,是有溢出的情况的;
设一个八位数的二进制为X0 X1 X…X7;
对于原码,X0 = 1,那么左移的话,会有溢出的情况;
对于反码,X0 = 0 ,那么左移的话,会有溢出的情况;
也就是说对于原码,移出去的高位有1的话,那么就会有溢出,对于反码,移出去的高位有有0的话, 那么就有溢出。
对于补码,如果符号位和数据最高位相同的话,那么就不会溢出,如果符号位和数据有不同的话,那么会有溢出的情况。
其实向左移一位,可以看成是加上相同的数,所以向左移位可以转化了二进制的加法运算,接下来我用双高位判别法来讲解一下溢出;
Cs:它表征最高位(符号位)的进位情况,若符号位有进位,则Cs=1,否则,Cs=0。
Cp:它表征数值部分的最高位的进位情况,若最高数值发生进位,则Cp=1,否则Cp=0。

比如:

所以可以根据,Cs和Cp的组合判断,会不会有溢出:

由于Cs和Cp的组合与符号位和数值最高位的组合一样,有相同的结果,所以可以下结论:
当数据的最高位和符号位不同时,此时进行算术左移会导致符号的变化,从而超出该数据的设定的范围大小,从而溢出,如果相同,则不会溢出。

参考资料:
1.百度百科——算术左移位:
https://baike.baidu.com/item/算数左移位/22225819?fr=aladdin
2.CSDN博客《右移一位和除二的区别》:
https://blog.csdn.net/FlushHip/article/details/82495034
3.百度百科——补码:
https://baike.baidu.com/item/补码/6854613?fr=aladdin
4.CSDN博客《算术左移后溢出判断》:
https://blog.csdn.net/qq_35661481/article/details/78991712
5.bilibili——《无符号二进制数的算术运算和逻辑运算及运算的溢出》
https://www.bilibili.com/video/BV1vp4y1Q7Zp?from=search&seid=3267128644212277897


http://chatgpt.dhexx.cn/article/R3rCMpjT.shtml

相关文章

【Java】位运算符---算术右移和逻辑右移、算术左移和逻辑左移

文章目录 1. 算术左移和逻辑左移2. 算术右移和逻辑右移3. Java中<<、>>和>>>的含义 1. 算术左移和逻辑左移 对于有符号数或无符号数&#xff1a;算术左移 逻辑左移。 操作逻辑&#xff1a;丢弃高位&#xff0c;低位补0。 数值变化&#xff1a;左移n位…

算术右移与逻辑右移的区别

算术右移与逻辑右移的区别&#xff1a; 1、右移移动的是二进制位 2、右移操作符分为算术右移操作符和逻辑右移操作符&#xff1a;算术右移操作符&#xff1a; 右边&#xff08;低位&#xff09;舍去&#xff0c;左边&#xff08;高位&#xff09;补原符号位&#xff0c;原符号位…

Mac 安装Git

使用mac安装git有两种方法&#xff0c;一种是mac自带的git&#xff0c;但是我看APP Store中评论不好。另一个是Git自己管理的软件&#xff0c;我使用的是这种。 1. 下载Git安装包&#xff08;https://git-scm.com/download/mac&#xff09; 下载完成之后&#xff0c;点击Finde…

mac 下载安装git

MAC下载安装Git 在官网下载git 官网地址&#xff1a;https://git-scm.com/downloads 选择对应的版本&#xff0c;安装即可 git命令 查看git版本&#xff1a;git --version查看git命令所在的安装路径: which git

mac m1 安装git、node

文章目录 1.安装brew2.验证3.解决not found: brew 配置环境变量4.隐藏问题6.安装git5.mac 安装node 1.安装brew Homebrew是Mac上的一个包管理器&#xff0c;可以帮助你轻松地安装和管理各种开源软件。要安装Homebrew&#xff0c;请打开终端并运行以下命令&#xff1a; /bin/z…

MAC上git安装及配置

MAC上git安装及配置 新换了Mac笔记本&#xff0c;用得很不习惯&#xff0c;浅记录一下 一、安装Git 首先查看电脑是否安装Git&#xff0c;终端输入&#xff1a; git没有找到&#xff0c;但电脑自动提示安装开发者工具&#xff0c;安装后测试git安装成功。 方式2&#xff1…

Mac 下面安装 Git 步骤

1、安装 homebrew 命令 先通过国内镜像文件下载homebrew安装包 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"运行结果如下所示&#xff1a; 此时这里会提示一个警告&#xff0c;这个其实是我们没有这个命令的环境…

win和mac安装使用git

win安装与使用git 首先可以在官网&#xff08;下载速度慢&#xff0c;但也能下载下来&#xff09;或者下面的淘宝镜像地址&#xff08;下载速度快&#xff09;将git下载下来&#xff0c;然后安装。 https://registry.npmmirror.com/binary.html?pathgit-for-windows/ 安装过…

MAC电脑上安装git并进行简单使用

在mac终端上运行git其实非常方便简单&#xff0c;但是我们需要先安装一个git的客户端。以下是git客户端安装的一个简单操作教程&#xff0c;希望能够对你有所帮助&#xff01; 1.安装git 官方网站地址&#xff1a;https://git-scm.com 点击Downloads&#xff1a; 选择macOS:…

Mac安装Git并配置到IDEA(超简单)

一、安装Git 1、在Mac的终端上输入git检测是否安装git&#xff0c;如果没有&#xff0c;点击弹出的“安装”按钮。 https://git-scm.com/downloads 或者 git2、安装完成之后&#xff0c;在终端输入 git --version 查看版本信息 git --version在终端输入 git --version 查看版…

小记MAC安装GIT

MAC安装GIT教程 0、安装方式说明 MAC安装软件的时候&#xff0c;有一个很好用的工具&#xff0c;叫&#xff1a;homebrew&#xff0c;大家可以试一下。 我这里采用下载安装包的方式进行。 1、下载git 我这里就暂且选择git最新版本&#xff0c;2.36.1。 正常情况下&#xff…

M1/M2 MAC 安装git

M1/M2 MAC 安装git 若想用mac自带的gitHomebrew安装 若想用mac自带的git cmd输入 git --version&#xff0c;会跳出来说明还没有安装&#xff0c;根据提示点确认安装就好【但gitk等不支持&#xff0c;一般还是从官网下比较方便】 Homebrew安装 官网中提供了几种&#xff0c;…

MAC安装git的三种方式

MAC安装git的三种方式 方式一&#xff1a;使用Homebrew安装方式二&#xff1a;从官方网站下载安装包方式三&#xff1a;使用Xcode Command Line Tools安装总结 在MAC上安装Git有多种方式&#xff0c;包括通过Homebrew、下载安装包等多种方式。以下是几种安装方式的步骤和说明。…

git for Mac安装

背景&#xff1a; 由于太多blog上安装说明繁琐而且方式不一定是最简便的&#xff0c;所以此时使用最简便以及用官方下载安装即可&#xff0c;而不是还要安装homebrew或Xcode&#xff0c;通过这种进行git的安装。 安装方式有三种&#xff1a; 1、下载git官方安装包&#xff0…

三种常见的 Mac 安装 git 工具的方法

目录 前言 正文 一、佛系法 二、brew 法 三、终极大法 结尾 前言 有时候新 Mac 本子需要安装 git 工具&#xff0c;或者原来的 git 工具损坏了&#xff0c;再或者需要升级 git 版本&#xff0c;都需要涉及重新安装 git&#xff0c;本文将介绍三种常见的安装方法。 正文 …

mac系统安装git 详细教程

0.概述 记录一下mac系统安装git环境 首先我们看一下自己的mac系统是否有git &#xff0c; 打开终端输入git --version 2.我们进入git官网 git官网下载界面https://git-scm.com/download/mac 通过官网介绍我们得知安装git有下面几种方式&#xff0c;我们下面会通过Homebrew的方式…

MacBook安装git教程,git学习这一篇就够了!

&#x1f33a;今天想和大家分享一下git&#xff0c;想做这一期的原因是因为在实习期间&#xff0c;在和测试部门的主管交流需求时&#xff0c;她发现我对git一窍不通&#xff0c;然后叫我有空看看git去&#xff0c;这不&#xff0c;我就开始看看git。我在下面放上github和git的…

Mac安装Git

文章目录 一、简介二、安装指引三、配置信息 一、简介 在Mac上安装Git之前&#xff0c;可以先使用git --version来查看一下是否安装了Git&#xff0c;因为Mac系统可能自带了Git&#xff0c;或者在你安装XCode&#xff08;或者XCode的命令行工具&#xff09;时&#xff0c;可能…

Win10家庭版没有本地组策略编辑器的解决办法

本篇博客会教大家手动安装本地组策略编辑器&#xff0c;因为win10家庭版并不自带这个编辑器&#xff0c;所以需要我们自己手动安装。 第一步&#xff1a;创建一个批处理文件 1、同时按下键盘上的WINR键&#xff0c;输入notepad回车&#xff0c;打开记事本。 2、将以下代码复制…

win10本地组策略编辑器找不到怎么办(超详细,超易懂)

1.在今天要打开本地组策略编辑器的时候&#xff0c;突然发现电脑当中没有出现&#xff0c;也就是系统本身没有自带这个编译器&#xff0c;那么解决方法如下&#xff1a; A.首先同时按键盘上的WINR键&#xff0c;打开运行对话框&#xff0c;输入notepad打开记事本&#xff1b; …