delphi位運算使用

Delphi 的按位運算符共有六個: not and or xor shr shl;
其中的 not and or xor 也叫邏輯運算符, 其實功能都是同樣的, 由於無論什麼數據追到底都是 0 和 1 的組合;
在 Delphi 內嵌彙編中, 應該也沒什麼區別(內嵌彙編還在學習中, 不太熟).

測試下面的例子時, 能夠用這裏的方法: [url]http://www.cnblogs.com/del/archive/2008/03/09/1097845.html[/url]
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或都是0)返回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.
相關文章
相關標籤/搜索