在 Ruby 中提取整数的位

10

我需要在Ruby中获取整数的第n位,可以是有符号或无符号的。

x = 123 # that is 1111011
n = 2   # bit 2 is ...0 

以下代码在一般情况下无法正常工作:
x.to_s(2)[-(n+1)] #0 good! but...

由于负数没有用2进制补码表示:

-123.to_s(2) # "-1111011"

那么,如何继续呢?
3个回答

16
x = 123 # that is 1111011
n = 2   # bit 2 is ...0

x[n]    # => 0

-123[2] # => 1

结果1和0被颠倒了。我尝试编辑您的帖子,但没有成功。 - JCLL
@JCLL:谢谢!这是一个情况,其中剪切和粘贴实际上会防止错误的发生 :-) - Jörg W Mittag
4
嘿,又发现了一个很酷的 Ruby 运算符:[] 用于 Fixnum,在文档中看起来很简单,但同时也被埋得很深。 - DigitalRoss
有没有一种方法可以在特定的索引处 设置 位,而不仅仅是获取?例如 a=2; a[0] = 1; a #=>3 ? - Mirror318
@Mirror318:不行。Integer是不可变的。 - Jörg W Mittag

6
def f x, bit
  (x & 1 << bit) > 0 ? 1 : 0
end

如果你只想要一个真/假结果,你可以省略 ? 1 : 0 - DigitalRoss

3
你可以尝试使用Bindata库

这个库有一个函数可以将整数的二进制表示转换为字符串,之后你可以自行处理它。


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