1

我正在寻找一种方法来翻转任意大小的数字(即:任意数量的位)中的所有位,并考虑将其取反。当我打印出来

p ~0b1010 == 0b0101

它说false。不过,我可能使用了错误的比较运算符。检查两个二进制数在表示上是否相等的正确方法是什么?

4

1 回答 1

0

一个补码不是翻转所有位。

要翻转位,您需要使用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

您可能想做一个简单的基准测试来测试它。

于 2013-06-07T03:31:53.783 回答