有符号数的二进制数右移

news/2024/7/5 20:02:05

把一个二进制数右移N位,规则为:
除符号位外,全部右移N位,
如果数字是一个无符号数值,则用0填补最左边的N位,
如果数字是一个有符号数值,则用1填补最左边的N位,
也就是说如果数字原先是一个正数,则右移之后在最左边补N个0;如果数字原先是个负数,则右移之后在最左边填补N个1。

例子:
0000 0010 >> 1 = 0000 0001 
0000 1010 >> 2 = 0000 0010
1000 0010 >> 1 = 1100 0001  
1000 1010 >> 3 = 1111 0001

上面的例子,正数的容易理解,为什么负数的是填补N个1呢,解释如下:
负数在计算机内部是以补码形式存放的,
1000 0010是一个负数,它的原码是1111 1110,也就是说它不是表示-2,而是表示-126;
证明1000 0010右移1位后是1100 0001呢,
1000 0010的原码是1111 1110,对原码右移1位,为1011 1111,(也就是-63),再换成补码,为1100 0001,
可以看出,1000 0010右移1位确实是1100 0001,也就是说,

换句话说,原码(正数)移位时,缺失位补0;

                  补码(负数)移位时,缺失位补符号位,当然正数时亦可(正数补码与原码完全一样)。

如果数字原先是个负数,则右移之后在最左边填补N个1。
 


http://www.niftyadmin.cn/n/3036997.html

相关文章

Blend ---- 给Button添加自定义状态模板(视觉状态管理)

一、首先按下图创建一个Silverlight for Windows Phone应用程序. XAML代码如下 View Code 1 <phone:PhoneApplicationPage 2 x:Class"PhoneApp1.MainPage"3 xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"4 xmlns:x&q…

重磅:spring boot 2.4正式发布,重大调整!!!

大家周末愉快啊&#xff0c;Spring Boot 2.3.5 没发布几天&#xff0c;你看&#xff0c;还是 1 周前发布的&#xff1a; 昨天又有粉丝留言说 Spring Boot 2.4.0 已经发布了&#xff1a; 我了个去&#xff0c;栈长赶紧跑到 Spring Boot 官网看了下&#xff0c;果然 2.4.0 了&…

《知识的边界》读书笔记

《知识的边界》 第一章 知识超载 知识的三角形 &#xff1a;信息一知识一智慧(DKIW, data - informationknowledge - wisdom) 1988 年&#xff0c; 知名组织理论家罗素 艾可夫&#xff08; Russell Ackoff) 在其就任国际一般系统研 究学会&#xff08; International Society f…

华为回应出售荣耀:一场自救行为

深圳市智信新信息技术有限公司已与华为投资控股有限公司签署了收购协议&#xff0c;完成对荣耀品牌相关业务资产的全面收购。随即华为回应出售荣耀:一场自救行为&#xff0c;不占股不经营&#xff0c;只为荣耀延续。 在产业技术要素不可持续获得、消费者业务受到巨大压力的艰难…

高活跃社群揭秘

这其实是上周我在《第一财经xCBNData数据盛典》上的演讲内容《盘活社群&#xff0c;让“消费者”变“品牌粉丝”》&#xff0c;非原创&#xff0c;且非常后悔有错别字 大家对这段话的感兴趣程度&#xff0c;以及传播的破圈效应&#xff0c;再次令我深深意识到&#xff0c;“社群…

5G消息或年底商用

据消息&#xff0c;目前三大运营商5G消息平台的建设进度不一&#xff0c;中国移动最为超前&#xff0c;但三大运营商很有可能在今年底联合宣布5G消息的商用。 在2020中国移动全球合作伙伴大会期间&#xff0c;e公司记者从参展商人士处了解到&#xff0c;目前&#xff0c;华为、…

如何运行Smali文件?

smali 是Android 应用程序&#xff08;*.apk&#xff09;反编译生成的文件格式&#xff0c; 是一种类似于汇编语言的底层计算机语言。阅读和书写smali语法都需要极大的耐心和勇气&#xff0c; 本文将介绍如何反编译和运行第三方的程序&#xff08;smali&#xff09;代码。 什么…

detect the number of 1 in the binary format of a integer data

for( i 0; i < 32; i ) begin if ( (din >> i) & 0x1) // right shift and detect the lsb cnt cnt 1; end