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



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

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

我找不到我的错误。(我正在使用德尔福 7(

你肯定使用了不寻常的从 1 开始的数值,所以看看这个表:

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

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

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;

最新更新