开发者社区> 非常老帅> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Delphi 的按位运算详解

简介:   Delphi 的按位运算详解     unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, F...
+关注继续查看

 

 


 


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.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
代理设计模式之静态代理与动态代理(超..)详解
  在学习Spring框架的时候,有一个重要的思想就是AOP,面向切面编程,利用AOP的思想结合Spring的一些API可以实现核心业务与辅助业务的分离,即可以在执行核心业务时,将一些辅助的业务加进来,而辅助业务(如日志,权限控制等)一般是一些公共业务,这样就实现了两者的分离,使得核心业务的代码更加...
936 0
<转>C++位运算详解
原文转自:http://www.crazycpp.com/?p=82 前言 以前收藏过一篇讲C++位操作的文章,这次博客搬家,以前的数据都没有保留,整理谷歌网站管理后台的时候,发现不时的还有网友有在查找这篇文章。
675 0
Delphi记录类型
  学习结构[记录]类型(1) - 开始 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form...
752 0
在delphi中如何动态建立类的实例
本文为原创,如需转载,请注明作者和出处,谢谢!     在面向对象语言中,用两种方法建立类的实例:静态建立和动态建立。静态建立就是在程序中显式地建立类的实例,如c1 = TClass1.Create()。
616 0
[Delphi]类型强制和转换
.style1 { FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #ff6699 } .yjx { BORDER-RIGHT: #f0f0f0 0px solid; BORDER-TOP: #f0f0f0 0px solid; BOR...
763 0
+关注
非常老帅
IT行业从业10+年
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载