Delphi的按位运算详解-回复来宾初学汇编的问题

Delphi的按位运算详解-回复来宾初学汇编问题问题来源:
Delphi 的按位运算符共有六个: not and or xor shr shl;
汉日互译其中的 not and or xor 也叫逻辑运算符, 其实功能都是⼀样的, 因为不管什么数据追到底都是 0 和 1 的组合;
在 Delphi 内嵌汇编中, 应该也没什么区别(内嵌汇编还在学习中, 不太熟).
测试下⾯的例⼦时, 可以⽤这⾥的⽅法:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
布兰妮最新专辑
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
w1: Word = 61680; {⼆进制表⽰: 11110000 11110000}
w2: Word = 3855;  {⼆进制表⽰: 00001111 00001111}
var
w: Word;
{not 运算, 只有⼀个运算数}
procedure TForm1.Button1Click(Sender: TObject);
begin
w := not w1;
{not 就是按位(给⼆进制的每⼀位)取反}
{11110000 11110000 取反后就是:}
{00001111 00001111 }
ShowMessage(IntToStr(w)); {3855}马哲睿
糖皮质激素受体end;
{and 运算, 需要两个运算数}
procedure TForm1.Button2Click(Sender: TObject);
begin
汽化热w := w1 and w2;
{and 就是把两个运算数按位对⽐, 同是1返回1, 反之返回0}
{w1: 11110000 11110000 与}
{w2: 00001111 00001111 每⼀位都不同, 所以返回:}
{w : 00000000 00000000}
ShowMessage(IntToStr(w)); {0}
end;
{or 运算, 需要两个运算数}
procedure TForm1.Button3Click(Sender: TObject);
begin
w := w1 or w2;
{and 就是把两个运算数按位对⽐, 只有其中⼀个是1就返回1; 都是0才返回0}
{w1: 11110000 11110000 与}
{w2: 00001111 00001111 or 后会返回:}
{w : 11111111 11111111}
ShowMessage(IntToStr(w)); {65535}
end;
{xor 运算, 需要两个运算数}
procedure TForm1.Button4Click(Sender: TObject);
begin
w := w1 or w2;
{and 就是把两个运算数按位对⽐, 只有两个不⼀样才返回1; ⼀样(都是0或都是1)则返回0}  {w1: 11110000 11110000 与}
{w2: 00001111 00001111 xor 后会返回:}
{w : 11111111 11111111}
ShowMessage(IntToStr(w)); {65535; 两个例数不太好, 没给 xor 和 or 区别明显}
end;
{shr 运算, 只有⼀个运算数}
procedure TForm1.Button5Click(Sender: TObject);
begin
w := w1 shr 1;
{shr 是按位右移, shr 1 是右移⼀位}
{w1: 11110000 11110000 右移⼀位后是:}
{w : *1111000 01111000 前⾯的*就是0了}
ShowMessage(IntToStr(w)); {30840}
{同理, 可以移动⼏位, 譬如 3 位}
w := w1 shr 3;
ShowMessage(IntToStr(w)); {7710}
{w1 shr 3 相当与 w1 div 2的3次⽅}
w := w1 div 8;
ShowMessage(IntToStr(w)); {7710}
end;
{shl 运算, 只有⼀个运算数}
procedure TForm1.Button6Click(Sender: TObject);
var
i: Integer;
begin
w := w1 shl 1;
{shr 是按位左移}
{w1: 11110000 11110000 左移⼀位后是:}
{w : 1110000 111100000 }北京市民卡
ShowMessage(IntToStr(w)); {57824}
{左移 3 位}
w := w1 shl 3;
ShowMessage(IntToStr(w)); {34688}
{w1 shl 3 相当与 w1 * 2的3次⽅}
w := w1 * 8;
ShowMessage(IntToStr(w)); {34688}
{注意这⾥有个问题: w1*8 以后怎么⼩了呢?}
{因为前⾯已经定义了 w 是 Word 类型的, 它的⼤⼩只有2个字节(⼆进制16位), 超出会忽略}  {如果换成32位(4字节)的 Integer 类型, 肯定就会有真实的结果:}
i := w1 shl 3;
ShowMessage(IntToStr(i)); {493440}
i := w1 * 8;
ShowMessage(IntToStr(i)); {493440}
end;
end.

本文发布于:2024-09-22 01:32:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/230732.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:汇编   问题   运算   运算符   按位   回复   初学
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议