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

Ruby 逐位检查整数(获取和设置),ruby,bit-manipulation,Ruby,Bit Manipulation,我需要这样做: For each bit in integer if (probability) flip the bit end end 我知道有一个很酷的技巧my_int[3]可以在索引中获取位,但是这个方法不能设置位 将转换为_s(2)效率太低,理想情况下我会将它们保留为整数。二进制数学 n = 55 num_bits = Math.log2(n).ceil + 1 (0...num_bits).each do |bit_idx| mask = 1 <<

我需要这样做:

For each bit in integer
  if (probability)
    flip the bit
  end
end
我知道有一个很酷的技巧
my_int[3]
可以在索引中获取位,但是这个方法不能设置位

转换为_s(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
n=55
num_bits=Math.log2(n).ceil+1
(0…num_位)。每个do|bit_idx|

掩码=1位运算符可用于:

^
“异或”翻转一点

|
“或”设置位

e、 g.要设置第n位:

x = x | (2 ** n) # or more concisely x |= 2 ** n 
或者把它翻过来

x = x ^ (2 ** n) # or more concisely x ^= 2 ** n 
带有
每个
的范围将是实现伪代码的一种方式:

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

你需要重新构造这个问题,以得到更好的答案。据我所知,您希望随机翻转位(或不翻转位)。为了给你最大的灵活性,我将把这个问题分解成两个更简单的问题

  • 构造一个位掩码以指示哪些位被翻转或不翻转
  • 在该位掩码上使用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
    
    #Getter
    my_int[i]
    #Setter仅适用于设置为1,而不是0
    
    我的_int | 1这太棒了,但是有没有办法让概率加权,而不是完全随机的?我只想以
    0.002
    的概率翻转位