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

szqfcxe2  于 2022-11-22  发布在  Ruby
关注(0)|答案(4)|浏览(237)

假设我有一个整数98,这个字符串的二进制表示为:

(98).to_s(2) # 1100010

现在我想把这个二进制字符串转换成一个整数数组,这个数组包含所有被置位的位。

[64,32,2]

我该怎么做?

**更新:**int到int数组的转换不一定需要涉及String,这只是我所知道的。我假设非String操作也会更快。

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

slwdgvem

slwdgvem1#

这 是 可行 的 :

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

中 的 每 一 个

  • Fixnum#bit_length 返回 最 高 " 1 " 位 的 位置
  • Fixnum#[n] 返回 整数 的 第 n 位 , 即 01
  • Fixnum#<< 将 该 位 左 移 。 1 << n 等于 2n

循序渐进 :

(0...i.bit_length).map { |n| i[n] }
#=> [0, 1, 0, 0, 0, 1, 1]

(0...i.bit_length).map { |n| i[n] << n }
#=> [0, 2, 0, 0, 0, 32, 64]

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

格式
你 可能 会 想要 reverse 结果 。
在 较 新 版本 的 Ruby ( 2.7 + ) 中 , 您 还 可以 使用 filter_mapnonzero? 来 移除 所有 0 值 :

(0...i.bit_length).filter_map { |n| (i[n] << n).nonzero? }
#=> [2, 32, 64]

格式

l5tcr1uw

l5tcr1uw2#

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

s.reverse.chars.map.with_index{ |c, i| c.to_i * 2**i }.reject{ |b| b == 0 }.reverse

或者,您可以使用each_with_index将值推入数组

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

可能更快,更容易阅读,但不太习惯。

eufgjt7s

eufgjt7s3#

(98).to_s(2).reverse.chars.each_with_index.
   map {|x,i| x=="1" ? 2**i : nil }.compact.reverse

让我们来分析一下:

  • 首先获取二进制字符串作为示例(98).to_s(2)
  • 我们需要从右侧开始0-index,因此为.reverse
  • .chars.each_with_index为位位置处的字符提供了诸如[ '1', 4 ]之类的对
  • .map将“1”字符转换为它们的值2 ** i(即2的当前位位置的幂),将“0”转换为nil,以便将其删除
  • .compact以丢弃不需要的nil
  • .reverse以2的降幂为例
toe95027

toe950274#

以下是几种方法:

第一名

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]

第二名

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]

相关问题