2025-11-09 00:32:27
左移一位空位补零结果等于原数乘二对吧。比如二进制数101变成1010就是十进制的十。比如八变成十六。比如数字二变成四。比如数字三变成六。比如数字五变成十。左移操作是把所有位向左推一位。最左边那个被推出去的位会丢失。右边空出来的位都用零填满。比如数字二二进制是10左移后变成100也就是四。这个操作相当于把数值扩大两倍。但要注意如果原数有符号位的话。负数左移可能改变符号。比如负二左移变成负四。但具体实现要看处理器怎么处理符号位。比如x86架构的左移指令会自动处理符号位扩展。
你想想二进制数101是五对吧。左移一位变成1010就是十。这时候每一位都往左挪了。最右边补零最左边那个1被挪出去。这样数值就变成原来的两倍。比如数字八二进制是1000左移后变成10000也就是十六。这时候数值乘以了二。但要注意如果原数有符号位的话。比如负数二进制用补码表示是1110。左移一位变成11100也就是负四。这时候符号位也跟着左移。但有些架构会自动在左边补符号位。比如x86的shl指令会保持符号位不变。比如负二左移变成负四。但像ARM架构可能处理方式不同。比如负二左移变成负四的时候。符号位会被正确保留。这时候数值就准确乘以二了。所以shl指令左移操作就是各位左移补零。数值乘二。但具体效果要看架构怎么处理符号位。比如移位次数超过位数的话。结果会变成零。比如数字五左移五位。二进制101变成五位左移后变成00000也就是零。这时候相当于原数乘以了32。但结果溢出变成了零。所以使用shl指令的时候要注意移位次数别超过位数。否则会得到错误结果。
本题链接: