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

Delphi 如何从字节中选择一些位?,delphi,delphi-7,Delphi,Delphi 7,我想从字节中获取一些位,如下所示: 251 dec=11111 011箱 我想得到第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);

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

251 dec=11111 011箱

我想得到第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还可以

但是

176十二月=10110000箱

结果是: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;

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

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;

您肯定使用了不寻常的基于一的计算,因此请看下表:

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

,您肯定使用了不寻常的基于一的计算,因此请查看下表:

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

,如何获取位1到位4?我想从中间获取位。我相信你给出了一个信号,因为我的函数是从右向左,而不是从左向右。你有0-3位。您需要位4-7,因此可能需要提取位srl(176,5,4)。您的代码显示(10110000 shr(1-1))和(00010000-1)=(10110000 shr 0)和(00001111)=10110000和00001111=0。@kobik,位通常从0开始枚举。@kobik,OP可能从1开始计数。(从左到右,嗯)如何得到比特1到4?我想从中间得到比特。我相信你给出了一个信号,因为我的函数是从右向左,而不是从左向右。你有0-3位。您需要位4-7,因此可能需要提取位srl(176,5,4)。您的代码显示(10110000 shr(1-1))和(00010000-1)=(10110000 shr 0)和(00001111)=10110000和00001111=0。@kobik,位通常从0开始枚举。@kobik,OP可能从1开始计数。(从左到右,嗯)我强烈建议使用通用规则。请注意,您的解释与位顺序相反,使用Dsm方法,您将得到
1101
,而不是
1011
,我强烈建议使用通用规则。请注意,您的解释与位顺序相反,使用Dsm方法,您将得到
1101
,而不是
1011