gpt4 book ai didi

ruby - 如何访问 ruby​​ 整数的符号位?

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:33 25 4
gpt4 key购买 nike

我想直接访问 ruby​​ 整数的符号位。

Ruby 允许通过 [] 运算符访问 int 的位:
1[0] -> 1
2[1] -> 1

我尝试了 -1[-1](访问最后一个),但这不起作用。

最佳答案

您可以通过查看 Fixnum#[] 的文档来理解这一点:

Returns the +n+th bit in the binary representation of fix, where fix[0] is the least significant bit

https://ruby-doc.org/core-2.2.0/Fixnum.html#method-i-5B-5D

A Fixnum不是数组,因此它是 #[]函数可以(并且确实)表现出与您对数组的期望不同的行为。

解决方案1

要访问最高有效位,您可以使用 #bit_length - 1

> a = 5
=> 5
> a[a.bit_length - 1]
=> 1

但是,这排除了负数的符号位,因此要获得符号位,请不要从 bit_length 中删除 1。

> a = -5
=> 5
> a[a.bit_length]
=> 1
> a = 42
=> 42
> a[a.bit_length]
=> 0

解决方案2

您也可以只使用 < 0比较:

> a = -5
=> -5
> sign_bit = a < 0 ? 1 : 0
=> 1

解决方案 3

首先,让我们阅读 #size 的文档:

Returns the number of bytes in the machine representation of fix.

从函数的实现我们可以了解到,如果存储的数字在 32 位有符号整数的范围内,则将存储为 1。在这种情况下 #size返回 4 .如果它更大,它将存储在一个 64 位整数和 #size 中。将返回 8 .

然而,并非所有这些位都在使用中。如果您存储号码 5 (0b101) 你的 32 位将被占用

10100000 00000000 00000000 00000000

负数大部分时间存储为 2 的补码(不确定是否适用于 ruby​​),这意味着如果您存储数字 -5你的 32 位将被占用

11011111 11111111 11111111 11111111

因此您也可以使用以下代码访问符号位:

x[x.size * 8 - 1]

奖金

如果你想知道为什么 5[-1]没有抛出异常还是返回一个数字,可以看Fixnum#[]的源码(在前面提到的文档页面上)。

if (i < 0) return INT2FIX(0);

返回0如果您的索引是负数。

关于ruby - 如何访问 ruby​​ 整数的符号位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39753873/

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