c语言中正数按位取反,js中怎么理解按位取反?

第一位同学写的挺好的,但一开始我没太明白为什么这样计算?,以下是学习做的笔记。

首先我们先要明白有符号整数,有符号整数的最高位表示的是符号位,0 为正数,1 为负数,例如(为方便理解,使用八位二进制):

// 十进制 => 原码

3 => 00000011

-3 => 10000011

然后是反码,正整数的反码就是它本身(原码),负整数的反码是在其本身的基础上符号位不变,再把其余各位取反。

// 十进制 => 原码 => 反码

3 => 00000011 => 00000011

-3 => 10000011 => 11111100

最后就是补码了,正整数的补码是它的原码,因此正整数的原码、反码、补码都是一样的;负整数的补码是在反码的基础上加 1 得到的。

// 十进制 => 原码 => 反码 => 补码

3 => 00000011 => 00000011 => 00000011

-3 => 10000011 => 11111100 => 11111101

上面这些概念我们理解之后,取反就很好懂了;取反是在补码的基础上进行的,因此取反运算(~n)需要将整数转为补码,之后再取反,最后转换成原码。需要注意的是,正整数的补码取反之后符号位是 1,因此这个取反后的数是一个负整数,我们需要按照负整数计算补码的方式做逆运算得到原码,例如:

3 => 00000011 => 11111100 => 11111011 => 10000100 => -4

// 1. 十进制转换成补码(00000011),需要注意正整数反码和补码是它本身

// 2. 对补码进行取反(11111100)

// 3. 把已经取反的补码转换成反码(11111011),补码转换成反码的公式:反码 = 补码 - 1

// 4. 最后把反码逆运算转换成原码(10000100),逆运算的过程是反码的符号位不变其余各位取反

// 5. 此时,结果就是 -4

负整数取反:

-3 => 10000011 => 11111100 => 11111101 => 00000010 => 2

// 1. 十进制转换成原码(10000011)

// 2. 原码转换成反码(11111100)

// 3. 反码转换成补码(11111101),公式是:补码 = 反码 + 1

// 4. 对反码进行取反(00000010),此时因为取反后的二进制数的符号位为 0,即表明这是一个正整数,上文说过正整数的反码和补码就是它本身,因此最终结果是 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值