负 FixNum 的无符号等价物
Unsigned equivalent of a negative FixNum
如何确定负 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
也许你可以试试这个测试:
(0x800000FF & ~0b01111011) == (0x800000FF & 0b10000100)
假设0x...代表十六进制常量
and & 代表您正在处理的语言的 AND 运算符。
前导 0x8 将强制扩展 32 位?
Fixnum#~
运算符执行 Two's complement 和 Ruby 使用内部任意大数和算术,所以如果你想在固定基数上进行反转,你需要在 required边界并相应地解释结果:
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
如何确定负 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
也许你可以试试这个测试:
(0x800000FF & ~0b01111011) == (0x800000FF & 0b10000100)
假设0x...代表十六进制常量 and & 代表您正在处理的语言的 AND 运算符。 前导 0x8 将强制扩展 32 位?
Fixnum#~
运算符执行 Two's complement 和 Ruby 使用内部任意大数和算术,所以如果你想在固定基数上进行反转,你需要在 required边界并相应地解释结果:
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