Delphi按位运算问题

发布于 2024-10-02 11:44:21 字数 307 浏览 3 评论 0原文

F0 7D 00 C8 00 ->11110000 01111101 00000000 11001000 00000000

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

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

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

过程setBit(a,b:Integer);

F0 7D 00 C8 00
->11110000 01111101 00000000 11001000 00000000

First 4 bits 1111=15 means, next 30 bits are used to store 2 values,15 bits each,
a=000001111101000=1000,b=000001100100000=800 (Signed-bit value)

1111000001111101000000001100100000 is paded with '000000' so it'll be 5 bytes.

How to make such a delphi procedure to change the value a & b,

procedure setBit(a,b:Integer);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

黯淡〆 2024-10-09 11:44:21

我猜你使用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 个字节中。

I guess you use LSB storage order.

Try this:

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

It will change the 8 bytes value pointed by dest, storing the data into the first 5 bytes.

随遇而安 2024-10-09 11:44:21

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

procedure SetBit(var L; bit: Longint);
asm
  BTS [EAX], EDX
end;

应该可以工作。请参阅http://www.intel.com/Assets/PDF/manual/253666。 pdf

The easiest way to set a bit is to use the assembler instruction BTS. Something alike (not tested)

procedure SetBit(var L; bit: Longint);
asm
  BTS [EAX], EDX
end;

should work. See http://www.intel.com/Assets/PDF/manual/253666.pdf

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文