翻转位而不得到负数
Flipping bits without getting negative number
如何在不改变符号的情况下翻转整数的位?例如,如何将 "1010"
(1010) 翻转为 "0101"
(510)?
位负运算符结果为负数:~10
(~0b1010
) → -11
(0b0101
).
我不确定它是否适合你的需要,但你可以像这样一个字符一个字符地翻转二进制字符串:
"1010".chars.map { |i| i == "1" ? "0" : "1" }.join #=> "0101"
更新:
这个怎么样:
a = ~10
(a.bit_length - 1).downto(0).map { |i| a[i] }.join #=> "0101"
您可以通过 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
如果你指的是字符串,那么:
"1010".tr("01", "10") # => "0101"
如果你指的是数字,那么:
10.to_s(2).tr("01", "10").to_i(2) # => 5
如何在不改变符号的情况下翻转整数的位?例如,如何将 "1010"
(1010) 翻转为 "0101"
(510)?
位负运算符结果为负数:~10
(~0b1010
) → -11
(0b0101
).
我不确定它是否适合你的需要,但你可以像这样一个字符一个字符地翻转二进制字符串:
"1010".chars.map { |i| i == "1" ? "0" : "1" }.join #=> "0101"
更新:
这个怎么样:
a = ~10
(a.bit_length - 1).downto(0).map { |i| a[i] }.join #=> "0101"
您可以通过 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
如果你指的是字符串,那么:
"1010".tr("01", "10") # => "0101"
如果你指的是数字,那么:
10.to_s(2).tr("01", "10").to_i(2) # => 5