2

如何确定负 FixNum 的无符号解释?

# unexpected, true
(~0b01111011).to_s(2) == ("-" + (~0b01111011).abs.to_s(2))

# expected, false
~0b01111011 == 0b10000100

我将如何编写这样的函数:

123.unsigned_not(8) == 132

或者:

-124.unsigned(8) == 132

编辑:我可以通过字符串来做到这一点,但解决方案远不能令人满意

class Fixnum
  def unsigned_not(bits=16)
    to_s(2).rjust(bits,'0').gsub(/[01]/, '0' => '1', '1' => '0').to_i(2)
  end
end
4

2 回答 2

2

Fixnum#~运算符执行二进制补码,而 Ruby 在内部使用任意大数和算术,因此如果您想在固定基数上进行反转,您需要在所需的范围内工作并相应地解释结果:

class Fixnum
  def neg(base=8)
    # xor with max in specific base
    self ^ (2**base - 1)
  end
end

132.neg             # 123
123.neg             # 132
~-124.neg           # 132
132.to_s(2)         # 1000010
132.neg.to_s(2)     # 0111101
# different result for a different base, as expected
132.neg(16).to_s(2) # 111111110111101
于 2015-12-08T03:31:53.527 回答
0

也许你可以试试这个测试:

(0x800000FF & ~0b01111011) == (0x800000FF & 0b10000100)

假设 0x... 代表十六进制常量, & 代表您正在处理的语言的 AND 运算符。前导 0x8 会强制 32 位扩展?

于 2015-12-08T00:47:30.613 回答