C語言按位取反快速計算
阿新 • • 發佈:2019-04-03
內部使用 證明 需要 內部 計算機 所有 假設 它的 code
= [(-x) + x ]補
= 0
也就是說-(-x)補=(-(-x))補 (3)
先說結論
假設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))]補
= 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語言按位取反快速計算