如何从字节中 select 一些位?

How to select some bits from byte?

我想从一个字节中获取一些位,像这样:

251 dec = 11111011 bin

我想得到位 3 到位 6。

我创建了一个函数:

function ExtractBitsRL (value, bits_start, bits_len: Integer) : Integer;
begin
  Result := ((value shr (bits_start - 1)) and ((1 shl bits_len) - 1));
end;

用法:

b := ExtractBitsRL (251,3,3);

结果是:110 OK。

但是

b := ExtractBitsRL (176,1,4);

176 dec = 10110000 bin

结果是:0000 而不是 1011

我找不到我的错误。 (我正在使用 Delphi 7)

使用您想要的计数模式

function ExtractBitsRL (value, bits_start, bits_len: Integer) : Integer;
begin
  Result := ((value shr (9 - bits_start - bits_len )) and ((1 shl bits_len) - 1));
  // would be 8 if you started at bit zero
end;

你肯定使用了不寻常的从一开始的计数,所以看看这个 table:

bit number  8  7  6  5  4  3  2  1 
176 dec =   1  0  1  1  0  0  0  0
251 dec =   1  1  1  1  1  0  1  1

并且您的函数给出了正确的结果。

不过你好像想象的是颠倒位序。 LSB 是二进制记录中最右边的位。所以要从 176 dec 中提取 1011,你需要参数 5,4

请注意,在您的(反向)解释中,结果应该看起来像 1101 而不是 1011