gpt4 book ai didi

ruby - 十六进制数的带符号 2 的补码

转载 作者:太空宇宙 更新时间:2023-11-03 17:07:57 30 4
gpt4 key购买 nike

如何使用 Ruby 将十六进制数(例如 'C4D81633')转换为带符号的 2 的补码,即 '-992471501'?我试过了

['C4D81633'.scan(/[0-9a-f]{2}/i).reverse.join].pack('H*').unpack('l')

但是当我给出长度小于 8 个字符的输入时,上面的代码不能正常工作。

最佳答案

取反运算符 (-) 已经做了一个二进制补码:

p (-0x1234).to_s(16)    # => "-1234"

问题出在 Ruby 的 to_s 上,它注意到它被取反了,并以我们几乎总是想要的方式输出它——带减号。

但是,如果我们屏蔽否定值,我们将让 Ruby 执行我们想要的操作:

 p (-0x1234 & 0xffff).to_s(16)    # => "edcc"

所以让我们把它们放在一起:

def negate(n, num_bits)
mask = (1 << num_bits) - 1
-n & mask
end

def negate_string(s, num_bits)
negate(s.hex, num_bits).to_s(16)
end

p negate_string("C4D81633", 32) # "3b27e9cd"

关于ruby - 十六进制数的带符号 2 的补码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438994/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com