我一直在寻找一种方法来翻转任意大小的数字(即:任意数量的位)中的所有位,并且想到只是否定它。当我打印出来
p ~0b1010 == 0b0101
它说false
。我可能会使用错误的比较运算符。检查两个二进制数在表示中是否相等的正确方法是什么?
答案 0 :(得分:0)
One complement并没有翻转所有位。
要翻转位,您需要使用带有参数的xor
操作,该参数的位数为1。
此外,你不能否定任意数字的二进制。您需要定义要翻转的位数。这个例子将告诉你原因:
> 0b000001 ^ 0b1
=> 0
> 0b000001 ^ 0b11
=> 2
> 0b000001 ^ 0b111
=> 6
> 0b000001 ^ 0b1111
=> 14
您可以做的是定义任意位数是您需要表示数字的最小位数。 这很可能不是您想要的,但是,以下代码可以为您执行此操作:
def negate_arbitrary_number(x)
# size is the number of significants digits you have on x.
size = 0
while (a >> size) != 0
size += 1
end
# this is the binary with all number 1's on
mask = ("1"*size).to_i(2)
# xor your number
x ^ mask
end
或此代码:
def negate_arbitrary_number(x)
x.to_s(2).unpack("U*").map{|x| x == 49 ? 48 : 49}.pack("U*")
end
你可能想做一个简单的基准来测试它。