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
になるのか? とも言える気がしてきました。