Delphi逐位运算问题

Delphi逐位运算问题,delphi,bit-manipulation,Delphi,Bit Manipulation,F0 7D 00 C8 00 ->11110000 01111000000000 11001000000000000 前4位1111=15意味着,接下来的30位用于存储2个值,每个值15位, a=00000111110000=1000,b=000001100100000=800(有符号位值) 11110000011101000000001100100000用“000000”填充,因此它将是5个字节 如何制作这样一个delphi程序来改变a和b的值 程序setBit(a,b:整数) 我猜您使用LS

F0 7D 00 C8 00 ->11110000 01111000000000 11001000000000000

前4位1111=15意味着,接下来的30位用于存储2个值,每个值15位, a=00000111110000=1000,b=000001100100000=800(有符号位值)

11110000011101000000001100100000用“000000”填充,因此它将是5个字节

如何制作这样一个delphi程序来改变a和b的值


程序setBit(a,b:整数)

我猜您使用LSB存储顺序

试试这个:

procedure SetBit(const a,b: cardinal; var dest);
var d: Int64 absolute dest;
begin
  d := $F000000000+(Int64(a) shl 21)+b shl 6;
end;

它将更改dest指向的8字节值,将数据存储到前5个字节。

设置位的最简单方法是使用汇编指令BTS。相似的东西(未经测试)


应该有用。请参见

您希望将值a和b更改为什么?你能给出这个setBit函数的一些输入和输出示例吗?输出的形式应该是什么?看起来像是家庭作业。。。你真的要我们帮你编码吗?我想你可能想先表现出一些努力,以便得到一些帮助数据来自哪里?字节数组?二进制流?欢迎来到堆栈溢出,比特小子。你问的问题显然不是很清楚。请使用左边的“编辑”链接来更改您的问题,并解决其他人和我所表达的困惑。您的问题似乎很有趣,我很想回答,但现在我仍然不知道您真正想要的是什么。为什么要使用非类型化的输出变量?对于不熟悉位操作的人来说,这可能会让人困惑。@Jens问题中的过程原型没有任何目标变量。。。一个非类型化的输出变量作为一个指针比较容易混淆。。。对于i:=0到100的do SetBit(i,i*2,aArray[i]),可以使用这样的函数,其中aArray:array[0..100,0..4]为byteb,但在所有情况下,关于LSB/MSB的使用顺序,问题都不清楚。它肯定会起作用。但问题的目的是在长度为5字节的位数组中设置两个15位值。
procedure SetBit(var L; bit: Longint);
asm
  BTS [EAX], EDX
end;