rubyのビット演算子の反転について
p (~0b1010).to_s(2)
は
"-1011"
になりました。
【ビット反転】 p ~0b1100 #=> -13になる理由がわかりませ... - Yahoo!知恵袋
には
ここで注意して頂きたいのが、負の数の管理方法です。一言で言うと、「その数にいくつ足すと0になるか」です。例えば~0b1100。2進数の部分に1101(2進数で13)を足すと
(1) 000000000000000000000000000000
とあります。
なにか計算によって0が並ぶような数値がビット反転の答えになると推測しました。
しかし1010 + 1011 は 10101になるので、理解できません。どうして
(~0b1010).to_s(2)は"-1011"になるのでしょうか?
追記:
コメントで頂いたとおり
p sprintf('%b', [0b1010].pack('L').unpack('L')[0])
p sprintf('%b', [~0b1010].pack('L').unpack('L')[0])
がそれぞれ
"1010"
"11111111111111111111111111110101"
となって、名前のとおり反転していることがわかりました。
ここで、
p (~0b1010).to_s(10)
p (~0b1010).to_s(2)
としてみたところ
"-11"
"-1011"
となったので、
10進数で-11
2進数で-1011
になることがわかりました。
2進数で-1011は10進数で-11ですので、質問はどうして~0b1010は10進数で-11になるのか? とも言える気がしてきました。