如何从字节中 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
我想从一个字节中获取一些位,像这样:
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