两位数的二进制表示的按位比较

时间:2013-06-07 02:27:42

标签: ruby bitwise-operators

我一直在寻找一种方法来翻转任意大小的数字(即:任意数量的位)中的所有位,并且想到只是否定它。当我打印出来

p ~0b1010 == 0b0101

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

1 个答案:

答案 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

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