我正在寻找一种方法来翻转任意大小的数字(即:任意数量的位)中的所有位,并考虑将其取反。当我打印出来
p ~0b1010 == 0b0101
它说false
。不过,我可能使用了错误的比较运算符。检查两个二进制数在表示上是否相等的正确方法是什么?
我正在寻找一种方法来翻转任意大小的数字(即:任意数量的位)中的所有位,并考虑将其取反。当我打印出来
p ~0b1010 == 0b0101
它说false
。不过,我可能使用了错误的比较运算符。检查两个二进制数在表示上是否相等的正确方法是什么?
一个补码不是翻转所有位。
要翻转位,您需要使用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
您可能想做一个简单的基准测试来测试它。