翻转位而不会得到负数

时间:2016-02-09 11:16:41

标签: ruby bit-manipulation

如何在不改变符号的情况下翻转整数的位?例如,如何将"1010"(10 10 )翻转为"0101"(5 10 )?

按位否定运算符会产生负数:~10~0b1010)→-110b0101)。

3 个答案:

答案 0 :(得分:9)

您可以通过XOR翻转位:

    1010 (decimal 10)
XOR 1111 (decimal 15)
  = 0101 (decimal 5)

在Ruby中:

0b1010 ^ 0b1111 #=> 5

1的数量对应于位数,因此您可以使用:

num  = 0b1010
num ^ (1 << num.bit_length) - 1
#=> 5

答案 1 :(得分:1)

如果你的意思是字符串,那么:

"1010".tr("01", "10") # => "0101"

如果你的意思是数字,那么:

10.to_s(2).tr("01", "10").to_i(2) # => 5

答案 2 :(得分:0)

我不确定它是否适合您的需求,但您可以像这样通过char翻转二进制字符串char:

"1010".chars.map { |i| i == "1" ? "0" : "1" }.join #=> "0101"

UPD:

这个怎么样:

a = ~10
(a.bit_length - 1).downto(0).map { |i| a[i] }.join #=> "0101"