大家好,又见面了,我是你们的朋友全栈君。
C 语言中负数移位运算讲解
“<<”、“>>”为移位运算符。 “<<”为左移位运算符,即数据字节中的每个二进制位同时
向左移位。如“x<<n”表示 x 中的每个二进制位同时向左移动 n 位。 “>>”为右移位运算
符,即数据字节中的每个二进制位同时向右移位。如“x>>n”表示 x 中的每个二进制位同时
向右移动 n 位。
下图演示了一个 2 字节变量左移 3 位的过程:
十进制数-555 的二进制表:
1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1
先转换成二进制补码表:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0
最左端位保持不变 补码加“1”后状态
再将补码加“1”:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1
下一步向左移 3 位:
1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0
左端“离开”3 位丢弃 右端“移入”3 位用“0”补齐
最左端一位保持不变
再转换成二进制补码表:
1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1
补码再加“1”:
到此步结束。
1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0
补码加“1”后状态
结果转换成十进制数为“- 4440”。
总结:负数左移时,任何情况下“移入”位将用“0”补齐。
“>>”右移位运算可分为两种情况:一种是移入“0”的叫逻辑右移;一种是移入“1”的叫
算术右移。 负数右移用到的是算术右移。
下图演示了一个 2 字节变量右移 3 位的过程:
十进制数-555 的二进制表:
1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1
先转换成二进制补码表:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0
最左端位保持不变 补码加“1”后状态
再将补码加“1”:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1
下一步向右移 3 位:
1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0
左端“移入”3 位用“1”补齐 右端“离开”3 位丢弃
最左端一位保持不变
再转换成二进制补码表:
1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1
补码再加“1”:
到此步结束。
1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
补码加“1”后状态
结果转换成十进制数为“- 70”。
总结:负数右移时,任何情况下“移入”位将用“1”补齐。
注:二进制表最左端的二进制位表示符号位,“+”用“0”表示,“-”用“1”表示。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159275.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...