[转]关于负数的左右位移运算 - 雾漫大武汉 - 博客园
2022/7/23 23:28:06
本文主要是介绍[转]关于负数的左右位移运算 - 雾漫大武汉 - 博客园,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
先备知识:
关于负数是如何在内存中是如何存储的?
在计算机内存当中,负数一律按照补码的形式进行存储,例如现在有一个负数-10
-10的二进制原码形式为
[1000 1010]2 这个地方需要注意的是高位为符号位,即当这个数字是负数的时候高位为1,正数时高位为0,且符号为不计入数值当中,只能表示正负数的概念。
当-10存入计算机当中的时候,内存中需要对负数的原码进行按位取反加一的操作,即进行求补码的操作;特别注意,符号位不参与变化
[1111 0110]2
当需要将负数从内存当中取出的时候,首先需要将补码转化成原码,转变规则为对当前的补码取反加一(其中符号为不参与变化),转变的原码为:
[1000 1010]2
负数左移位运算相关操作:
以-10举例首先进行左移2位运算(-10<<2):
1)-10的补码形式为:
[1111 0110]2
2)向左移动2位,右端补0得到新的补码为:
[1101 1000]2
3)将当前补码从内存中取出,取出时需要将补码转化成原码形式:
[1010 1000]2
4)通过换算可得[2 8]16加上符号即为[-40]10
负数右移位运算相关操作:
仍然是以-10来举例,将-10右移2位(-10>>2):
1)确定-10的补码形式为:
[1111 0110]2
2)向右移动2位,高位补符号位,说人话就是符号位是几就补几:
[1111 1101]2
3)转化为原码形式取出(取反加一,符号位为不动):
[1000 0011]2
4)计算出来的结果为[0 3]16加上符号得出[-3]10
总结:
左移运算一律在右端补0,右移运算一律在左端补符号数(负数符号位为1就补1,正数符号位为0就补0)
特别注意的是:
负数是不能在原码的基础上进行操作的,需要首先转化成补码才能进行移位运算,并且运算的结果并不是直接结果,还是需要将其转化为原码才能当做运算结果输出!
其中不要忘记了加上负号!
补:
特别注意溢出问题:负数移位溢出之后的值一律为-1,正数移位溢出之后的值一律为0
有时间再补上溢出问题。
---------------------
作者:雾漫大武汉
来源:CNBLOGS
原文:https://www.cnblogs.com/oldfish123/p/14941113.html
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件
这篇关于[转]关于负数的左右位移运算 - 雾漫大武汉 - 博客园的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?