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

简介: 正数和负数需转换成二进制后进行移位运算。左移低位补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月前
|
存储
算数移位,逻辑移位以及循环移位
算数移位,逻辑移位以及循环移位
103 0
|
C语言
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
61 0
|
存储 C语言
有符号位与无符号位超超超详解!!!
有符号位与无符号位超超超详解!!!
278 0
|
C语言 Python
左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?
左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?
十进制与二进制转换(负数+正数)
十进制与二进制转换(负数+正数)
347 0
十进制与二进制转换(负数+正数)
|
Java
java中的左移、右移、无符号右移
阅读java源码会经常碰到左移与右移运算。那么左移与右移都是怎么运算呢?查询资料学习了下,这里做个总结。
308 0
java中的左移、右移、无符号右移
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
297 0
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
有符号右移>>,无符号右移>>>
有符号右移>>,无符号右移>>>
130 0
|
C语言 编译器
C语言里的左移和右移运算
在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
2096 0