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

时间:2016-12-21 21:20:18

标签: ruby bit-manipulation

我需要做这样的事情:

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

我知道有一个很酷的技巧my_int[3]来获取索引,但这种方法不能设置该位。

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

4 个答案:

答案 0 :(得分:3)

按位运算符可用于此:

^"独家或"翻转一下

|"或"设置一点

e.g。设置第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

答案 1 :(得分:2)

二进制数学!

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

答案 2 :(得分:1)

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

  1. 构造一个位掩码,指示哪些位被翻转。
  2. 在该位掩码上使用XOR来翻转位掩码上设置的任何位。
  3. 对于第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
    

    就是这样。

答案 3 :(得分:0)

按位操作

我从每个答案中删除了一些内容:

# 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