如何在Ruby中将负整数转换为二进制

5
问题1:我找不到一种将负整数转换为二进制的方法。我应该按照以下方式进行转换。
-3 => "11111111111111111111111111111101"

我尝试了以下内容:
sprintf('%b', -3) => "..101" # .. appears and does not show 111111 bit.

-3.to_s(2) => "-11" # This just adds - to the binary of the positive integer 3.

问题2:有趣的是,如果我使用在线转换器,它告诉我-3的二进制是"00101101 00110011"。

代码"11111111111111111111111111111101"和"00101101 00110011"之间有什么区别?


你可以简单地反转一个正数的位来得到它的相反数。 - Andrew Li
2
请每个帖子只提出一个问题。 - Aleksei Matiushkin
2
另外,请澄清转换规则;目前我无法想到将 11111111111101 转换成 -3 的方法。 - Aleksei Matiushkin
2
@mudasobwa 那是 _二进制补码_。 - Stefan
@Stefan...在长整型为32位的系统上,是的。 - Aleksei Matiushkin
2个回答

11

打包再解包将把-3转换为4294967293(232-3):

[-3].pack('L').unpack('L')
=> [4294967293]

sprintf('%b', [-3].pack('L').unpack('L')[0])
# => "11111111111111111111111111111101"

sprintf('%b', [3].pack('L').unpack('L')[0])
# => "11"

太好了,它能正常工作!但在这种情况下,pack('L')和unpack('L')[0]是什么意思? - Noby Fujioka
@NobyFujioka,请查看Array#packString#unpack的文档。 - falsetru
1
值得一提的是,上述代码只在64位架构下产生长度为32的结果。 - Aleksei Matiushkin
根据文档,L代表32位无符号本机字节序(uint32_t)。@mudasobwa - falsetru
哦,确实,我把事情搞砸了。我的意思是,长度32的请求值可能只适用于64位。无论如何。 - Aleksei Matiushkin

1

尝试:

> 32.downto(0).map { |n| -3[n] }.join
#=> "111111111111111111111111111111101

注意:这仅适用于负数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接