1. 程式人生 > >C語言按位取反快速計算

C語言按位取反快速計算

內部使用 證明 需要 內部 計算機 所有 假設 它的 code

先說結論

假設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)成立。證畢。

C語言按位取反快速計算