Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby将整数转换为二进制,再转换为设置位的整数数组_Ruby_Binary_Xor - Fatal编程技术网

Ruby将整数转换为二进制,再转换为设置位的整数数组

Ruby将整数转换为二进制,再转换为设置位的整数数组,ruby,binary,xor,Ruby,Binary,Xor,假设我有一个整数98。 此字符串的二进制表示形式为: (98).to_s(2) # 1100010 现在我想把这个二进制字符串转换成一个整数数组,它包含所有设置的位。这将给我: [64,32,2] 我该怎么办 更新:int到int数组的转换不一定需要涉及字符串,这正是我所知道的。我认为非字符串操作也会更快 Ruby看到了所有这些不同的处理方法,真是太棒了 以下是几种方法: #1 s = (98).to_s(2) sz = s.size-1 s.each_char.with_index.wit

假设我有一个整数98。 此字符串的二进制表示形式为:

(98).to_s(2) # 1100010
现在我想把这个二进制字符串转换成一个整数数组,它包含所有设置的位。这将给我:

[64,32,2]
我该怎么办

更新:int到int数组的转换不一定需要涉及字符串,这正是我所知道的。我认为非字符串操作也会更快

Ruby看到了所有这些不同的处理方法,真是太棒了


以下是几种方法:

#1

s = (98).to_s(2)
sz = s.size-1
s.each_char.with_index.with_object([]) { |(c,i),a| a << 2**(sz-i) if c == '1' }
  # => [64, 32, 2] 
s=(98).对s(2)
sz=s.size-1
s、 每个带有索引的字符都带有对象([]){|(c,i),a | a[64,32,2]
#2

n = 2**(98.to_s(2).size-1)
arr = []
while n > 0
  arr << n if 90[n]==1
  n /= 2
end
arr
  #=> [64, 32, 2]
n=2**(98.to_s(2.size-1)
arr=[]
当n>0时
arr[64,32,2]

以下是几种方法:

#1

s = (98).to_s(2)
sz = s.size-1
s.each_char.with_index.with_object([]) { |(c,i),a| a << 2**(sz-i) if c == '1' }
  # => [64, 32, 2] 
s=(98).对s(2)
sz=s.size-1
s、 每个带有索引的字符都带有对象([]){|(c,i),a | a[64,32,2]
#2

n = 2**(98.to_s(2).size-1)
arr = []
while n > 0
  arr << n if 90[n]==1
  n /= 2
end
arr
  #=> [64, 32, 2]
n=2**(98.to_s(2.size-1)
arr=[]
当n>0时
arr[64,32,2]
唷!让我们把它分解一下:

  • 首先获取二进制字符串作为示例
    (98)。to_s(2)

  • 我们需要从右侧开始0-index,因此
    。反向

  • .chars。每个带有索引的\u都为我们提供了位位置字符的配对,例如
    ['1',4]

  • .map
    将“1”字符转换为它们的值
    2**i
    (即,将2转换为当前位位置的幂),将“0”转换为
    nil
    ,以便将其删除

  • .compact
    放弃不需要的
    nil

  • .reverse
    以降幂2为例

唷!让我们把它分解一下:

  • 首先获取二进制字符串作为示例
    (98)。to_s(2)

  • 我们需要从右侧开始0-index,因此
    。反向

  • .chars。每个带有索引的\u都为我们提供了位位置字符的配对,例如
    ['1',4]

  • .map
    将“1”字符转换为它们的值
    2**i
    (即,将2转换为当前位位置的幂),将“0”转换为
    nil
    ,以便将其删除

  • .compact
    放弃不需要的
    nil

  • .reverse
    以降幂2为例


    • 反转字符串,将其映射到每个数字的二进制代码值,拒绝零。可以选择再次反转

      s.reverse.chars.map.with_index{ |c, i| c.to_i * 2**i }.reject{ |b| b == 0 }.reverse
      
      或者,您可以使用
      将值推送到带有索引的每个\u的数组中

      a = []
      s.reverse.each_with_index do |c, i|
        a.unshift c.to_i * 2**i
      end
      

      可能更快、可读性更强但不太惯用的字符串。

      将字符串反转,将其映射到每个数字的二进制代码值,拒绝零。可以选择再次反转

      s.reverse.chars.map.with_index{ |c, i| c.to_i * 2**i }.reject{ |b| b == 0 }.reverse
      
      或者,您可以使用
      将值推送到带有索引的每个\u的数组中

      a = []
      s.reverse.each_with_index do |c, i|
        a.unshift c.to_i * 2**i
      end
      
      可能更快、可读性更高,但不太惯用的内容。

      这可以:

      i = 98
      (0...i.bit_length).map { |n| i[n] << n }.reject(&:zero?)
      #=> [2, 32, 64]
      
      您可能希望
      反转结果。

      这将起作用:

      i = 98
      (0...i.bit_length).map { |n| i[n] << n }.reject(&:zero?)
      #=> [2, 32, 64]
      


      您可能想
      反转
      结果。

      哪个版本或Ruby库在
      字符串上为您提供
      .map
      在这里?它不在核心RubyNeat中,不知道
      。使用_index
      修饰符。不过,以前在某些版本中,字符串用于混合可枚举,而map的工作时间早于。哪个版本或Ruby库是giv在
      字符串上添加
      .map
      ?它不在核心RubyNeat中,不知道
      。使用_index
      修饰符。但在某些版本中,字符串用于混合可枚举性,而map的工作时间早于。.map将“1”字符转换为其值2**i和“0”你能详细说明一下吗?2**i做什么?它只是指数运算,也就是说,
      x**y
      是“x乘以y的幂”.Phew!为什么需要第一次反转?因为
      .to_s
      输出的右边有最低有效位,我们想在计算2的哪个幂时将其与位位置0关联。你也可以通过从字符串长度中减去字符串中的位置来解决这个问题(Cary的第一个示例就是这样做的)“.map将“1”字符转换为其值2**i,将“0”转换为零,以便将其删除”您能详细说明一下吗?2**i的作用是什么?它只是求幂运算,即,
      x**y
      是“x到y的幂”.Phew!为什么需要第一次反转?因为
      .to_s
      输出的右边有最低有效位,我们想在计算2的哪个幂时将其与位位置0关联。你也可以通过从字符串长度中减去字符串中的位置来解决这个问题(Cary的第一个示例就是这样做的)它不仅可以工作,而且比目前为止的其他示例通过
      String
      要干净得多。98:Fixnum的未定义方法'bit_length'我不是最新的Ruby版本,所以这似乎不起作用Ruby 2.0.0p353我想是的:/Ruby太棒了!有没有其他不使用bit_length的非字符串方法?@mahatmanich有一个
      bit\u length
      的Ruby实现:否则,您可以使用固定值,具体取决于您的数字。非常优雅。
      bit\u length
      []
      它不仅可以工作,而且比通过
      字符串
      更干净。98:Fixnum的未定义方法'bit\u length'我不是最新的Ruby版本,所以这似乎不起作用Ruby 2.0.0p353我想是这样的:/Ruby太棒了!还有没有使用bit\u length的非字符串方法吗?@mahatmanich有一个Ruby实现,用于
      bit\u length
      :否则,您可以使用一个固定的值,具体取决于您的数字。非常优雅。
      bit\u length
      []