假设我有一个整数98,这个字符串的二进制表示为:
(98).to_s(2) # 1100010
现在我想把这个二进制字符串转换成一个整数数组,这个数组包含所有被置位的位。
[64,32,2]
我该怎么做?
**更新:**int到int数组的转换不一定需要涉及String,这只是我所知道的。我假设非String操作也会更快。
Ruby看到所有这些不同的处理方法真是太棒了!
slwdgvem1#
这 是 可行 的 :
i = 98 (0...i.bit_length).map { |n| i[n] << n }.reject(&:zero?) #=> [2, 32, 64]
中 的 每 一 个
Fixnum#bit_length
Fixnum#[n]
0
1
Fixnum#<<
1 << n
循序渐进 :
(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_map 和 nonzero? 来 移除 所有 0 值 :
reverse
filter_map
nonzero?
(0...i.bit_length).filter_map { |n| (i[n] << n).nonzero? } #=> [2, 32, 64]
格式
l5tcr1uw2#
反转字符串,将其Map到每个数字的二进制代码值,拒绝零。也可以再次反转。
s.reverse.chars.map.with_index{ |c, i| c.to_i * 2**i }.reject{ |b| b == 0 }.reverse
或者,您可以使用each_with_index将值推入数组
each_with_index
a = [] s.reverse.each_with_index do |c, i| a.unshift c.to_i * 2**i end
可能更快,更容易阅读,但不太习惯。
eufgjt7s3#
(98).to_s(2).reverse.chars.each_with_index. map {|x,i| x=="1" ? 2**i : nil }.compact.reverse
让我们来分析一下:
(98).to_s(2)
.reverse
.chars.each_with_index
[ '1', 4 ]
.map
2 ** i
nil
.compact
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]
4条答案
按热度按时间slwdgvem1#
这 是 可行 的 :
中 的 每 一 个
Fixnum#bit_length
返回 最 高 " 1 " 位 的 位置Fixnum#[n]
返回 整数 的 第 n 位 , 即0
或1
Fixnum#<<
将 该 位 左 移 。1 << n
等于 2n循序渐进 :
格式
你 可能 会 想要
reverse
结果 。在 较 新 版本 的 Ruby ( 2.7 + ) 中 , 您 还 可以 使用
filter_map
和nonzero?
来 移除 所有0
值 :格式
l5tcr1uw2#
反转字符串,将其Map到每个数字的二进制代码值,拒绝零。也可以再次反转。
或者,您可以使用
each_with_index
将值推入数组可能更快,更容易阅读,但不太习惯。
eufgjt7s3#
让我们来分析一下:
(98).to_s(2)
.reverse
.chars.each_with_index
为位位置处的字符提供了诸如[ '1', 4 ]
之类的对.map
将“1”字符转换为它们的值2 ** i
(即2的当前位位置的幂),将“0”转换为nil
,以便将其删除.compact
以丢弃不需要的nil
值.reverse
以2的降幂为例toe950274#
以下是几种方法:
第一名
第二名