用位检查整数(获取和设置)



我需要做类似的事情:

For each bit in integer
  if (probability)
    flip the bit
  end
end

我知道有一个很酷的技巧my_int[3]可以在索引上获取位,但是此方法不能 set bit。

转换to_s(2)的效率太低了,理想情况下,我将把它们保留为整数。

可以使用位运算符:

^"独家或"翻转一点

|"或"设置一些

例如。设置第n个位:

x = x | (2 ** n) # or more concisely x |= 2 ** n 

或翻转

x = x ^ (2 ** n) # or more concisely x ^= 2 ** n 

each的范围将是实现您的伪代码的一种方法:

(0...num_bits).each do |bit|
   ...
end

二进制数学!

n = 55
num_bits = Math.log2(n).ceil + 1
(0...num_bits).each do |bit_idx|
  mask = 1 << bit_idx
  # set bit
  n |= mask
  # unset bit
  n &= ~mask
end

您需要重新构架该问题才能获得更好的答案。据我了解,您想随机翻转位(或不)。为了给您最大的灵活性,我将这个问题分解为两个简单的问题。

  1. 构造一点口罩以指示哪些位会被翻转。
  2. 在该位蒙版上使用XOR翻转位于掩模上的所有位。

对于第1步,您可以将随机数弥补到所需的数字数量。

n = 137 # 10001001
bit_mask = rand(2**8) # 10110110
flipped = n ^ bit_mask # 00111111
# flip the first, third, fourth, sixth and seventh bits
# should be 00111111
# 63

就是。

位操作

我从每个答案中拉出一些碎片:

# Getter
my_int[i]
# Setter—only works setting to 1, not to 0
my_int | 1 << i
# Setter—set to 0
my_int - (1 << i)
# Flipper
my_int ^ 1 << i

最新更新