Delphi语法和位移问题
看一下这段代码:代码取自一个输入汉字显示该汉字的16X16点阵的程序procedureGetQWCode(HZ:string;varQ,W:Word);beginQ:=B...
看一下这段代码:代码取自一个输入汉字显示该汉字的16X16点阵的程序
procedure GetQWCode(HZ: string; var Q, W: Word);
begin
Q := Byte(HZ[1]) - $A0;
W := Byte(HZ[2]) - $A0;
end;
procedure MakeChar(HZ: String; n: integer);
var
OffSet: integer;
GetStr: array [0..31] of byte;
temp,dis:byte;
x, y, i, j: integer;
Q, W: word;
begin
GetQWCode(HZ,Q, W);
OffSet := (94*(Q-1)+(W-1))*32;
Seek(f, OffSet);
BlockRead(f, GetStr, SizeOf(GetStr));
//GetStr
x:=0;
y:=0;
i:=0;
j:=0;
while(i<=31) do
begin
temp:=getstr[i];
for j:=0 to 7 do begin
dis:=temp and 128;
dis:=dis shr 7;
if dis=1 then
form1.Image1.Canvas.Rectangle(n*32+(x+1)*2-1,(y+1)*2-1,n*32+(x+1)*2-1+3,(y+1)*2-1+3);
inc(x);
if x>15 then begin
x:=0;
inc(y);
end;
temp:=temp shl 1;
end;
inc(i);
end;
end;
其中dis:=temp and 128; 是什么意思?and不是布尔运算符吗?这里代表的是什么??
dis:=dis shr 7;位移是个什么概念?为什么要位移?
最好能详细讲解一下这段代码?谢谢,只有这么多分,见谅! 展开
procedure GetQWCode(HZ: string; var Q, W: Word);
begin
Q := Byte(HZ[1]) - $A0;
W := Byte(HZ[2]) - $A0;
end;
procedure MakeChar(HZ: String; n: integer);
var
OffSet: integer;
GetStr: array [0..31] of byte;
temp,dis:byte;
x, y, i, j: integer;
Q, W: word;
begin
GetQWCode(HZ,Q, W);
OffSet := (94*(Q-1)+(W-1))*32;
Seek(f, OffSet);
BlockRead(f, GetStr, SizeOf(GetStr));
//GetStr
x:=0;
y:=0;
i:=0;
j:=0;
while(i<=31) do
begin
temp:=getstr[i];
for j:=0 to 7 do begin
dis:=temp and 128;
dis:=dis shr 7;
if dis=1 then
form1.Image1.Canvas.Rectangle(n*32+(x+1)*2-1,(y+1)*2-1,n*32+(x+1)*2-1+3,(y+1)*2-1+3);
inc(x);
if x>15 then begin
x:=0;
inc(y);
end;
temp:=temp shl 1;
end;
inc(i);
end;
end;
其中dis:=temp and 128; 是什么意思?and不是布尔运算符吗?这里代表的是什么??
dis:=dis shr 7;位移是个什么概念?为什么要位移?
最好能详细讲解一下这段代码?谢谢,只有这么多分,见谅! 展开
2个回答
展开全部
and除了boolean运算外,这里也表示 按位与 运算。
shr,右移。
GetQWCode,计算汉字的区位码,Q 区码,W,位码
offset 根据区位计算这个字在点阵库f 中的位置
blockread 根据offset 从 f 中读出这个字的点阵信息:32个字节,存放在getstr里面
while,每次处理getstr 中的一个字节,取出后放在 temp 中
for,每次处理 temp的一个位
dis:=temp and 128,就是取出这个字节的最高位
dis:=dis shr 7, 就是把这个最高位移到最低位
for 循环的最后,temp:=temp shl 1,是把temp 左移一位
整体上,就是从高到低,依次判断temp中的每一位是否为1,如果是,就画一个点。gerstr中两个字节表示这个字的点阵的一行,由x来控制
x,y分别控制点阵中点的坐标
至于为什么右移,因为后面要判断dis是否等于1,这是写代码的人的思路
若不右移,也可以改成:
dis:=temp and 128
if dis=128 then
....
shr,右移。
GetQWCode,计算汉字的区位码,Q 区码,W,位码
offset 根据区位计算这个字在点阵库f 中的位置
blockread 根据offset 从 f 中读出这个字的点阵信息:32个字节,存放在getstr里面
while,每次处理getstr 中的一个字节,取出后放在 temp 中
for,每次处理 temp的一个位
dis:=temp and 128,就是取出这个字节的最高位
dis:=dis shr 7, 就是把这个最高位移到最低位
for 循环的最后,temp:=temp shl 1,是把temp 左移一位
整体上,就是从高到低,依次判断temp中的每一位是否为1,如果是,就画一个点。gerstr中两个字节表示这个字的点阵的一行,由x来控制
x,y分别控制点阵中点的坐标
至于为什么右移,因为后面要判断dis是否等于1,这是写代码的人的思路
若不右移,也可以改成:
dis:=temp and 128
if dis=128 then
....
展开全部
我来解答一下,我也是现学现卖,呵呵:
1。
and可以用作与运算,or可以用于或运算.
比如:
procedure TForm1.Button1Click(Sender: TObject);
var
b: DWORD;
begin
b := $FFAA;
b := b and $AA;
ShowMessage(IntToHex(b,4));
end;
这段代码,运行时输出"00AA".
2。
shr是逻辑右移运算,比如0010,右移一位,就变成了0001,等于是除以2。 shr 7就等于dis 除以了 2的7次方
用以下代码可以验证:
var
b: DWORD;
begin
b := 2;
b := b shr 1;
ShowMessage(IntToHex(b,4));
至于程序里为什么要这么做,我也搞不懂了,反正是一个算法就对了...
补充:楼上大哥说的好..
对了,刚才想说,后来想不起来了.我也正在学Delphi,建议你多看看它自带的帮助,很有效.
1。
and可以用作与运算,or可以用于或运算.
比如:
procedure TForm1.Button1Click(Sender: TObject);
var
b: DWORD;
begin
b := $FFAA;
b := b and $AA;
ShowMessage(IntToHex(b,4));
end;
这段代码,运行时输出"00AA".
2。
shr是逻辑右移运算,比如0010,右移一位,就变成了0001,等于是除以2。 shr 7就等于dis 除以了 2的7次方
用以下代码可以验证:
var
b: DWORD;
begin
b := 2;
b := b shr 1;
ShowMessage(IntToHex(b,4));
至于程序里为什么要这么做,我也搞不懂了,反正是一个算法就对了...
补充:楼上大哥说的好..
对了,刚才想说,后来想不起来了.我也正在学Delphi,建议你多看看它自带的帮助,很有效.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询