如何从字节中选择一些位?

时间:2017-08-22 13:56:21

标签: delphi delphi-7

我想从一个字节中获取一些位,如下所示:

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可以。

但是

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

176 dec = 10110000 bin

结果是:0000而不是1011

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

2 个答案:

答案 0 :(得分:2)

你肯定使用不寻常的基于单一的计算,所以看看这个表:

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是二进制记录中最右边的位。因此,要从1011中提取176 dec,您需要参数5,4

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

答案 1 :(得分:0)

使用您想要使用的计数模式

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;