我想从一个字节中获取一些位,如下所示:
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)
答案 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;