Ruby将整数转换为二进制,再转换为设置位的整数数组
假设我有一个整数98。 此字符串的二进制表示形式为: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).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]
将“1”字符转换为它们的值.map
(即,将2转换为当前位位置的幂),将“0”转换为2**i
,以便将其删除nil
放弃不需要的.compact
值nil
以降幂2为例.reverse
- 首先获取二进制字符串作为示例
(98)。to_s(2)
- 我们需要从右侧开始0-index,因此
。反向
.chars。每个带有索引的\u都为我们提供了位位置字符的配对,例如
['1',4]
将“1”字符转换为它们的值.map
(即,将2转换为当前位位置的幂),将“0”转换为2**i
,以便将其删除nil
放弃不需要的.compact
值nil
以降幂2为例.reverse
- 反转字符串,将其映射到每个数字的二进制代码值,拒绝零。可以选择再次反转
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
、[]
和