作者:呐街角-伤_774 | 来源:互联网 | 2023-01-28 09:11
为了从被解释为比特流的字节数组中提取位字段,我的目标是设备一个有效的位字段提取功能,针对Intel的现代CPU(理想情况下使用新的BEXTR指令)和MS Visual Studio 2017(I在VB.NET中开发.
Inputs: Bitstream left to right (MSB first)
Pos=0...7, Len=1...8
Output: bitfield at Pos in length Len (LSB right-aligned)
作为Pos=0...7
和Len=3
(掩盖省略)的示例:
Byte0 Byte1 Shifts
01234567 01234567
xxx >> 5
xxx >> 4
xxx >> 3
xxx >> 2
xxx >> 1
xxx n/a
xx x <<1 | >> 7
x xx <<2 | >> 6
从示例中,伪代码中可能天真的实现将是:
Extract(Pos, Len, ByteAddr):=
if 8-Pos-Len > 0
Res:=[ByteAddr+0] >> 8-Pos-Len
Res:=Res & (2^Len-1)
elseif 8-Pos-Len <0
Res:=[ByteAddr+0] <> 16-Pos-Len))
else
Res:=[ByteAddr+0] & (2^Len-1)
fi
在"纸上"(notepad.exe
这些天)进行测试,Len=4
并Pos=0...7
表明该算法可能有效:
Byte0 Byte1 B0>> B0<<&(2^Len-1) B1>> B0|B1
8-Pos-Len Pos+Len-8 16-Pos-Len
01234567 01234567 01234567 01234567 01234567 01234567 01234567
xxxx.... | 0000xxxx | 0000xxxx | |
.xxxx... | 000.xxxx | 0000xxxx | |
..xxxx.. | 00..xxxx | 0000xxxx | |
...xxxx. | 0...xxxx | 0000xxxx | |
....xxxx | | 0000xxxx | |
.....xxx y....... ....xxx0 0000xxx0 0000000y 0000xxxy
......xx yy...... ....xx00 0000xx00 000000yy 0000xxyy
.......x yyy..... ....x000 0000x000 00000yyy 0000xyyy
问题:
(1)出于效率原因,我应该使用查找表代替2^Len-1
,还是可以依赖编译器来可靠地优化2的幂?(当然,我也可以使用(1<.编译器是否这样做?)
(2)在VB.NET中,我如何继续指示编译器,请使用新BEXTR
指令?
(3)我应该完全不同,即将所有内容打包在查找表中吗?(毕竟,它只有8 x 8种可能性.但是,它不会真正可扩展.)