求按位取数操作代码,很容易得分哦!!!!!!!!!!(50分)

  • 主题发起人 主题发起人 philchan
  • 开始时间 开始时间
P

philchan

Unregistered / Unconfirmed
GUEST, unregistred user!
一组数据由BYTE1,BYTE2,BYTE3 BYTE4组成,现要做如下操作:
取BYTE3和BYTE4,并且去掉BYTE3的高二位,剩余14位,每7位为一个数据,共组成二个数据。
或者取 BYTE2 BYTE3 BYTE4去掉BYTE2的高三位,剩余21为,每7位为一个数据,共组成三个数据。
这样的代码怎么写?
 
你的byte1,byte2,byte3,byte4分别是byte类型吗?还是一个dword类型?

procedure GetNumbers(const byte3,byte4:byte;var Hibyte,Lobyte:byte)
var
aWord,tmpWord:word;
begin
aWord:=Bypte3;
aWord:=tmpWord shl 8;
aWord:=TmpWord+byte4;
aWord:=tmpWord shl 2;
aWord:=tmpWord shr 2;

TmpWord:=aWord;
Hibyte:=TmpWord shr 7;

TmpWord:=aWord shl 9;
LoByte:=TmpWord shr 9;
end;

这时HiByte得到高7位,LoByte得到低7位。

 
to lichaogang:谢谢你的回答,能帮忙再修改一下吗,我实在不会写这个
定义的是BYTE类型
GlobeStack:Array [0..3] of byte;
 
var
biData0, biData1: Byte;
...
b3 := b3 and $3F; //去掉BYTE3的高二位

//第一个数据
biData0 := (b3 shl 1) or (b4 and $80) and $7F;
Sorry, 上面一句有错,应该为:
biData0 := (b3 shl 1) or (b4 and $80 or $7F) and $7F;

//第二个数据
biData1 := b4 and $7F;

 
to gipsycn:谢谢
那去掉高三位的代码怎么写?
 
>>那去掉高三位的代码怎么写?

b3 := b3 and $1F//理解and運算,¥1F就是00011111。
 
to gipsyCn:谢谢
取 BYTE2 BYTE3 BYTE4去掉BYTE2的高三位,剩余21为,每7位为一个数据,共组成三个数据。这样的代码怎么写?
我现在急用,能帮忙写一个完整的吗?

 
象lichdr所说,理解Pascal中的AND、OR、XOR等位运算了,原理一样。

干脆给你下面的两个函数,你自己发挥,不难。

function GetBit(X, aBit: Byte): Boolean;
begin
Result:= (X and (1 shl aBit)) <> 0;
end;
procedure SetBit(var X: Byte; aBit: Byte);
begin
X:= X or (1 shl aBit);
end;
 
我看不懂呀,我主要是急用,现在没时间去理解,能帮帮我吗
 
事实上这是一样的,不过我用的方法看起来不是很好,如果用and的话则看起来会好一些:

type
TByteArray=GlobeStack:Array [0..3] of byte; //在程序首部定义

procedure GetNumbers(const aByteArray:TByteArray;var RByteArray:TByteArray);
var
aDWord,tmpdWord:word;
begin
aDWord:=aByteArray[1] and 31; //00011111 去掉byte2的高三位
aDWord:=aDWord shl 16;

TmpDword:=aByteArray[2];
TmpDWord:=TmpDWord shl 8; //左移8位,将低8位移入高8位
aDWord:=aDword or TmpDWord; //加到aDWord上
aDWord:=aDWord or aByteArray[3];//加到aDword上。

TmpDWord:=aDWord;
TmpDWord:=TmpDWord shl 25; //将高25位移出,再右移则可得到低7位
RByteArray[3]:=TmpDWord shr 25;

TmpDWord:=aDWord;
TmpDWord:=TmpDWord shr 7;//将最低7位移出;
RByteArray[2] :=TmpDWord and 127;//01111111,得到第二个7位
TmpDWord:=TmpDWord shr 7;//再移出7位,则现在tmpDword中只有7位二进制了
RByteArray[1]:=TmdWord and 127;
end;

1.这个函数假定你的数组是下标越小则位越高
2.返回的三个byte的下标分别为1,2,3,而下标0中无值。

 
我的QQ是43485743,lichaogang and GipsCn ,我们能在线交流吗?
 
公司不可QQ!
 
哈!philchan,是你啊,我突然想起你是谁了。认识“沧海一啸”吧?可惜公司不能上QQ,笔记本也被同事借走了,也不能拨号上QQ。

我是想让你好好理解一下那段代码,其实就是Pascal中的位操作而已。
 
var
biData0, biData1, biData2: Byte;
...
b3 := b3 and $1F; //去掉BYTE3的高三位

//第一个数据
biData0 := (b3 shl 2) or (b4 and $C0 or $3F) and $7F;

//第二个数据
biData1 := (b4 shl 1) or (b5 and $80 or $7F) and $7F;

//第三个数据
biData2 := b5 and $7F;

试试这个。
 
[:D][:D]to 沧海一啸:
哇,是你呀,谢谢啦,你写的那两个函数,我看不太懂呀,
还是请你帮我写一下那个取高三位的函数吧,可以吗?
今天回家去看看书,按位转换数据,我真的不懂
 
to GipsyCN:非常感谢,你能上QQ后,我再请教你哦
 
我们还挺有缘分的,我这个懒人,水平也不高,很少回答别人的帖子。
没想到这个“富翁”会是你的。[:D]
有空来我家玩,我女朋友还要向你请教物流方面的知识。到时让她给你烧几道湘菜。
[:D][:D][:D]
 
多谢多谢,我也是湖南人呢,红烧冬瓜好吃吧。现在我主要也是做通讯方面的程序了,很菜哦,以后会经常打扰的。
 
我写的例子还请楼主试试!
 
to lichaogang:好的,谢谢你的帮助.
 
后退
顶部