We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
0000 0001的真值 = +000 0001 = +1
1000 0001的真值 = –000 0001 = –1
对于一个数, 计算机要使用一定的编码方式进行存储。原码, 反码, 补码是机器存储一个具体数字的编码方式
[+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补
由此可见,正数的原码反码补码都是自身,负数的反码,补码都无法直观看出其数值,需要转换成原码再计算其数值
对于计算机,加减乘数已经是最基础的运算, 要设计的尽量简单,而让计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂。于是人们开始探索将符号伪参与运算,并且只保留加法的方法
若用原码计算十进制减法:1-1=0,结果是不正确的:
1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
使用反码时,结果的真值部分正确:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
而反码的问题在于 0 上,反码中会有 [0000 0000]原=+0 和 [1000 0000] 原=-0两个编码表示0,于是出现了解决这一问题的补码 [1000 0000补(8 位二进制机器数中,补码还能够多表示一个最低数 -128=[1000 0000]补 ):
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
功能:对应的两个二进位 均为1 时,结果为 1,否则为 0 例子:9&5 = 1001&0101 = 0001,即 9&5=1 *规律:二进制中与 1& 保持原位,与 0& 为0
功能:对应的两个二进位 只要有一个为1 时,结果为 1,否则为 0 例子:9|5 = 1001|0101 = 1101,即 9|5=13
9^5 = 1001^0101 = 1100
9^5=12
5^5=0
5^6^7 = 5^7^6
x^0 = x
x^y^x = x^x^y = 0^y = y
~9 = -10
~9=~[00001001]原=[11110110]补=[11110101]反=[10001010]原=-10
x << n
x * 2n
x >> n
x / 2n
##(& 按位 与「AND」)奇偶判断
##(^ 按位 异或「XOR,EOR」)数值转换
a shl b
a shr b
Hello,我是韩亦乐,现任本科软工男一枚。软件工程专业的一路学习中,我有很多感悟,也享受持续分享的过程。如果想了解更多或能及时收到我的最新文章,欢迎订阅我的个人微信号:韩亦乐。我的简书个人主页中,有我的订阅号二维码和 Github 主页地址;[我的知乎主页]中也会坚持产出,欢迎关注。 本文内部编号经由我的 Github 相关仓库统一管理;本文可能发布在多个平台但仅在上述仓库中长期维护;本文同时采用【知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议】进行许可。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
一、机器数和真值
0000 0001的真值 = +000 0001 = +1
,1000 0001的真值 = –000 0001 = –1
二、原码,反码和补码的基础概念
对于一个数, 计算机要使用一定的编码方式进行存储。原码, 反码, 补码是机器存储一个具体数字的编码方式
由此可见,正数的原码反码补码都是自身,负数的反码,补码都无法直观看出其数值,需要转换成原码再计算其数值
三、为什么要使用原码,反码和补码
对于计算机,加减乘数已经是最基础的运算, 要设计的尽量简单,而让计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂。于是人们开始探索将符号伪参与运算,并且只保留加法的方法
若用原码计算十进制减法:
1-1=0
,结果是不正确的:使用反码时,结果的真值部分正确:
而反码的问题在于 0 上,反码中会有 [0000 0000]原=+0 和 [1000 0000] 原=-0两个编码表示0,于是出现了解决这一问题的补码 [1000 0000补(8 位二进制机器数中,补码还能够多表示一个最低数 -128=[1000 0000]补 ):
四、原码,补码,反码再深入
五、数据溢出测试
六、位运算的运算说明
& 按位 与「AND」
| 按位 或「OR」
^ 按位 异或「XOR,EOR」
9^5 = 1001^0101 = 1100
,即9^5=12
5^5=0
5^6^7 = 5^7^6
x^0 = x
x^y^x = x^x^y = 0^y = y
~ 按位 取反「NOR」
~9 = -10
(因为负数是补码存储的)<< 左移(shl)
x << n
x * 2n
>> 右移(shr)
x >> n
x / 2n
七、位运算的简单应用
##(& 按位 与「AND」)奇偶判断
##(^ 按位 异或「XOR,EOR」)数值转换
(<< 左移 和 >> 右移)优化乘除法效率
a shl b
的值等于a乘以2的b次方a shr b
比如二分查找、堆的插入操作等等The text was updated successfully, but these errors were encountered: