我想要的是:
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 进行异或。