首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >负FixNum的无符号等价

负FixNum的无符号等价
EN

Stack Overflow用户
提问于 2015-12-08 00:22:57
回答 2查看 134关注 0票数 2

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

代码语言:javascript
复制
# unexpected, true
(~0b01111011).to_s(2) == ("-" + (~0b01111011).abs.to_s(2))

# expected, false
~0b01111011 == 0b10000100

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

代码语言:javascript
复制
123.unsigned_not(8) == 132

或者另一种选择:

代码语言:javascript
复制
-124.unsigned(8) == 132

编辑:我可以通过字符串来完成这个任务,但是解决方案远不能令人满意。

代码语言:javascript
复制
class Fixnum
  def unsigned_not(bits=16)
    to_s(2).rjust(bits,'0').gsub(/[01]/, '0' => '1', '1' => '0').to_i(2)
  end
end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-08 03:31:53

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

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2015-12-08 00:47:30

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

代码语言:javascript
复制
(0x800000FF & ~0b01111011) == (0x800000FF & 0b10000100)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34145891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档