c语言int型按位取反,C语言按位取反快速计算

先说结论

假设x为signed int,也就是说它的补码表示中第一位表示符号(1:负;0:正),那么~x=-(x+1)

证明

计算机内部使用补码表示,则问题相当于求证:当x为signed int时,(~x)补=[-(x+1)]补 (0)

证明:

因为补码有个规律:(x+y)补=(x)补+(y)补,所以:

[-(x+1)]补

= [(-x)+(-1)]补

= (-x)补 + (-1)补

要证(~x)补=[-(x+1)]补,只需要证(~x)补-(-x)补=(-1)补 (1)

考虑到:

(~x)补-(-x)补

=(~x)补+(-(-x)补) (2)

(-x)补+(-(-x))补

= [(-x) + (-(-x))]补

= [(-x) + x ]补

= 0

也就是说-(-x)补=(-(-x))补 (3)

把(3)带入(2),得到:

(~x)补-(-x)补

= (~x)补+(-(-x))补

= [(~x) + x ]补

= [1111...11]补 (所有位都为1)

= [1111...10]反 (最后一位为0,其它位都为1)

= [1000...01]原 (第一位和最后一位为1,其它位都为0)

= (-1)补

也即(1)得证,因而(0)成立。证毕。

原文:https://www.cnblogs.com/zjutzz/p/10646760.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值