p (~0b1010).to_s(2)

"-1011"

になりました。

【ビット反転】 p ~0b1100 #=> -13になる理由がわかりませ... - Yahoo!知恵袋

には

ここで注意して頂きたいのが、負の数の管理方法です。一言で言うと、「その数にいくつ足すと0になるか」です。例えば~0b1100。2進数の部分に1101(2進数で13)を足すと
(1) 000000000000000000000000000000

とあります。

なにか計算によって0が並ぶような数値がビット反転の答えになると推測しました。

しかし1010 + 101110101になるので、理解できません。どうして
(~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進数で-101110進数で-11ですので、質問はどうして~0b101010進数で-11になるのか? とも言える気がしてきました。