【编程基础知识】正数负数的二进制位运算(左移 右移 无符号右移)

简介: 正数和负数需转换成二进制后进行移位运算。左移低位补0,不影响符号位;右移符号位跟随移动,最高位还原为原符号位;无符号右移高位补0,适用于负数处理。

⭐⭐⭐正数和负数需先转换成相应的二进制,再进行移位运算.详细举例如下🌙🌙🌙:
1、左移(向左移动,低位补0,没有无符号左移,因为左移不影响符号位):
(1)正数左移 2<<1

(a)2为正数,其原码反码和补码均 00000000 00000000 00000000 00000010
(b)00000000 00000000 00000000 00000010 <<1 = 00000000 00000000 00000000 00000100 = 4

(2)负数左移 -2<<1

(a)-2原码 10000000 00000000 00000000 00000010
(b)-2反码 11111111 11111111 11111111 11111101
(c)-2补码 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 <<1 = 11111111 11111111 11111111 11111100
(e)11111111 11111111 11111111 11111100低位减1=11111111 11111111 11111111 11111011
(f)11111111 11111111 11111111 11111011取反=10000000 00000000 00000000 00000100= -4

2、右移(符号位先跟着向右移动完之后,最高位再还原为原符号位):
(1)正数右移 2>>1

(a)2为正数,其原码反码和补码均 00000000 00000000 00000000 00000010
(b)00000000 00000000 00000000 00000010 >>1 = 00000000 00000000 00000000 00000001 = 1

(2)负数右移 -2>>1

(a)-2原码 10000000 00000000 00000000 00000010
(b)-2反码 11111111 11111111 11111111 11111101
(c)-2补码 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 >>1=11111111 11111111 11111111 11111111(负数,需转换)
(e)11111111 11111111 11111111 11111111低位减1=11111111 11111111 11111111 11111110
(f)11111111 11111111 11111111 11111110取反=10000000 00000000 00000000 00000001= -1

2、无符号右移(向右移动,高位补0,符号位也跟着移动,主要针对负数):
(1)正数无符号右移 2>>>1(由于右移不影响正数符号位,故与正数右移结果一致)
...省略,具体参考正数右移...
(2)负数无符号右移 -2>>>1

(a)-2原码 10000000 00000000 00000000 00000010
(b)-2反码 11111111 11111111 11111111 11111101
(c)-2补码 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 >>>1 = 01111111 11111111 11111111 11111111(正数,不需转换)
(e)01111111 11111111 11111111 11111111=2^0+2^1+2^2+...+2^30
(f)设s=2^0+2^1+2^2+...+2^30
    2s=2^1+2^1+2^2+...+2^30+2^31
   则2s-s=2^31-2^0=2^31-1=2,147,483,648 - 1 = 2,147,483,647
目录
相关文章
|
6月前
|
存储
算数移位,逻辑移位以及循环移位
算数移位,逻辑移位以及循环移位
102 0
|
6月前
补码浮点数运算(设数的阶码为3位,尾数为6位(均不包括符号位)按机械补码浮点运算规则完成下列[x+y]补运算。)
补码浮点数运算(设数的阶码为3位,尾数为6位(均不包括符号位)按机械补码浮点运算规则完成下列[x+y]补运算。)
342 0
|
存储 C语言
有符号位与无符号位超超超详解!!!
有符号位与无符号位超超超详解!!!
278 0
单目操作符(含原码反码补码转换)
单目操作符(含原码反码补码转换)
|
C语言 Python
左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?
左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?
二进制浮点数的加减法运算
二进制浮点数的加减法运算
十进制与二进制转换(负数+正数)
十进制与二进制转换(负数+正数)
344 0
十进制与二进制转换(负数+正数)
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
297 0
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
有符号右移>>,无符号右移>>>
有符号右移>>,无符号右移>>>
130 0