我想要的是:

assert_equal 6, ones_complement(9)   # 1001 => 0110
assert_equal 0, ones_complement(15)  # 1111 => 0000
assert_equal 2, ones_complement(1)   # 01 => 10

输入的大小不是固定的 4 位或 8 位。而是它的二进制流。

我所看到的:
v = "1001".to_i(2)                 => 9

翻转操作符~
(~v).to_s(2)                       => "-1010"
sprintf("%b", ~v)                  => "..10110"
~v                                 => -10

我认为它与用于存储标志或其他东西的一位有关......有人可以解释这个输出吗?如何在不诉诸字符串操作的情况下获得一个补码,例如从 sprintf 输出中剪切最后 n 个字符以获得“0110”或将 0 替换为 1,反之亦然

最佳答案

听起来您只想翻转四位(输入的长度) - 所以您可能想要与 1111 进行异或。

10-08 09:25