Delphi 的按位运算详解

 

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-23 16:14:07

Delphi 的按位运算详解的相关文章

PHP位运算 详解

在实际应用中可以做用户权限的应用 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到"位运行符"操作,& 位与运算符. 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与运算,然后计算结果会再转换为10进制数输出. 它的权限值是这样的 2^0=1,相应2进数为"0001″(在这里^我表示成"次方",即:2的0次方,下同) 2^1=2,相应2进数为"0010″ 2^2=4,相应2进数为"0100″ 2^3=8

C语言 位运算详解及示例代码_C 语言

所谓位运算,就是对一个比特(Bit)位进行操作.在<二进制思想以及数据的存储>一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了. C语言提供了六种位运算符: 运算符 & | ^ ~ << >> 说明 按位与 按位或 按位异或 取反 左移 右移 按位与运算(&) 一个比特(Bit)位只有 0 和 1 两个取值,只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0.例如1&1

shell 基本计算、逻辑运算、位运算详解_linux shell

以下面的格式提供运算表达式:$(( expression )) $ echo $((5*(3+3))) 30 $ result = $(($myvar-10)) shell提供方便的数之间的进制转换: $ echo $((013))#八进制 $ echo $((0xA4))#十六进制 还可以使用以下格式指定 2 到 64 之间的任意进制: $((BASE#NUMBER)) echo $((8#377)) echo $((16#D8)) 在 Shell 中进行进制转换的另一个诀窍是使用 bc, 它

C语言实现大整数加减运算详解_C 语言

前言     我们知道,在数学中,数值的大小是没有上限的,但是在计算机中,由于字长的限制,计算机所能表示的范围是有限的,当我们对比较小的数进行运算时,如:1234+5678,这样的数值并没有超出计算机的表示范围,所以可以运算.但是当我们在实际的应用中进行大量的数据处理时,会发现参与运算的数往往超过计算机的基本数据类型的表示范围,比如说,在天文学上,如果一个星球距离我们为100万光年,那么我们将其化简为公里,或者是米的时候,我们会发现这是一个很大的数.这样计算机将无法对其进行直接计算.     可

判断Unix系统及库文件是32位还是64位的详解_Linux

判断Unix系统及库文件是32位还是64位的详解 一.查看系统32还是64位系统 bootinfo -y    查看硬件位数 bootinfo -K   查看内核位数 二.查看库文件是32位还是64位 1.使用file命令 Linux: # file libnss1_files-2.2.4.so libnss1_files-2.2.4.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped # file lib

C 语言指针变量的运算详解_C 语言

指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法.减法.比较等,请看下面的代码: #include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最初的值 printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X\n", &

C++位运算符详解(异或运算符和移位运算符)_C 语言

什么是位运算 位运算符按二进制进行运算,这些运算符只能用于整数类型的操作.如:char,short,int,long 通过位运算符来获取高位值和低位值 int a=0x1234; int high,low; high = (a>>8) &0x00ff; low = a & 0x00ff; 左移运算符和右移运算符(<<和>>) 左移是将一个二进制数,移动若干位,右边空出的位置用0来填补,高位左移溢出应该舍弃该高位. 如:inta = 8, a = 0000

百度排名11位现象详解:人工干预VS算法规则

百度11位现象一直是站长讨论的最为火爆的一个话题.许多站长反映新站,老站都会出现这种情况.目前网络流传的百度11位现象,非百度排名机制(算法规则)更新,存在人工干涉降权情况.所谓无法恢复,那是自己做优化的经验不够,没有用心去做优化. 百度排名11位是指你的站点中流量不错的主要关键词(有些流量的,排名前几位的)百度排名从首页或第一位被固定在第二页的第一位(即第11位),且不止一个词,存在多个词不约而同的掉到11位.例如:企赢旗下的徐州礼品网核心关键词(徐州礼品.徐州礼品公司),一段时间就存在百度1

PowerShell中的加法运算详解_PowerShell

大家已经PowerShell中的运算符有了一定感性的认识.我们首先来学习"+"运算符.PowerShell定义了"+"运算符处理数值类型.字符串类型.数组类型和哈希表类型的具体行为.在进行数值计算时,"+"和平时的数值计算规则基本一样.不过需要注意,由于计算机内部表示不同数值类型时,使用的存储空间不同,因此这些类型都只能表示一个范围内的数据.在进行数值运算的过程中,如果计算结果超过了参与计算数值类型的值域时,PowerShell将会自动进行类型转