按位运算的使用 ( 积分: 50 )

  • 主题发起人 主题发起人 liangexcel
  • 开始时间 开始时间
L

liangexcel

Unregistered / Unconfirmed
GUEST, unregistred user!
看过一个例子,type
TData=packed record
case Integer of
0: (
IntData:Integer;
ExtData:array[0..2]of Byte );
1: ( Data:array[0..6]of Byte )
end;
var
M: integer;
m:=(i1 shl 24) or (i2 shl 16) or (i3 shl 8) or i4;
IntData := m
上面定义的类型何解?m的结果是怎么得到上面类型的4个byte值的?反正就是不明白,请有关人士能够耐心点详细解释,m取值的过程,上面这个类型为何这样定义的?
 
4 byte = 1 Integer
1 byte = 8 位二进制
所以,上面的代码实际上是把4个byte数据按照位移的方式组合成一个32位的数。用形象的方式理解,shl就等于是把原来低位的数字往高位移动(数值变大),shr就等于把原来高位的数字往低位移动(数值变小),这里的or就是把他们相加在一起的意思。
 
对一个Byte的8个Bit位进行操作1. 对应8个位(bit)的数据:
00000000 , 00H, 0
00000001 , 01H, 1 //第0位为1 如果取低1位的值 就 and $1(1)
00000010 , 02H, 2 //第1位为1 如果取低2位的值 就 and $3(3) $3 = 3
00000100 , 04H, 4 //第2位为1 如果取低3位的值 就 and $7(7) $7 = 7
00001000 , 08H, 8 //第3位为1 如果取低4位的值 就 and $0F(15) $0F = 15
00010000 , 10H, 16 //第4位为1 如果取低5位的值 就 and $1F (31) $1F = 31
00100000 , 20H, 32 //第5位为1 如果取低6位的值 就 and $3F(63) $3F = 63
01000000 , 40H, 64 //第6位为1 如果取低7位的值 就 and $7F(127) $7F = 127
10000000 , 80H, 128 //第7位为1 如果取低8位的值 就 and $FF(255) $FF = 255
var
I: Byte;
begin
I := $01 or $04 or $10 or $40 or $80;
Memo1.Lines.add(Format('I = %s , %.2xH, %d ', [IntToBin(I), I, I]));
I := I and $F0;
Memo1.Lines.add(Format('保留高4位 I = %s , %.2xH, %d ', [IntToBin(I), I, I]));
I := $01 or $04 or $10 or $40 or $80;
I := I and $0F;
Memo1.Lines.add(Format('保留低4位 I = %s , %.2xH, %d ', [IntToBin(I), I, I]));



var I: Byte
I := $00;
2.把I的 0, 2, 4, 7位置1
I := $01 or $04 or $10 or $80;
I := '二进制 = 1001,0101';

3.把I的 0, 2, 4位清0
I := I and (not $01) and (not $04) and (not $10);
I := '二进制 = 1000,0000'


3.把I shl 1位
I := $01 or $04 or $10 or $80

I := '二进制 = 1001,0101'

I := I shl 1;
I := '二进制 0010,1010';

4.把I shr 2位
I := $01 or $04 or $10 or $80

I := '二进制 = 1001,0101'

I := I shr 2;
I := '二进制 = 00100101';
如何检查一个位的数据是否为1
第一位: I and $01 = $01;
最高位: I and $80 = $80;

0 and 0/1 = 0
1 and 0 = 0;
1 and 1 = 1;



5.一个Byte最高 High(Byte) = 255 也就是 0 ..255, 256个数据;

6.用两个Byte表示一个Word类型
I := HIByte(Word);
N := LOByte(Word);
//====还原
Word := Hibyte * 255 + Hibyte + Lobyte;
or
MakeWord(B{Lobyte}, I{Hibyte})


var
D: Word;
I, B: Byte;
begin
D := 43224;
I := Hibyte(D);
B := Lobyte(D);

Memo1.Lines.add(Format(' %d, %d ', [I, B]));
//====还原
D := I * 255 + I + B;
or D := MakeWord(B{Lobyte}, I{Hibyte})

Memo1.Lines.add(Format('%d', [D]));
 
楼上解释的最详细!呵呵,攒一个!
 
呵呵, 位操作,写汇编的人都非常熟,转成delphi也就是这几样了
 
后退
顶部