现在我需要对32位的无符号数据进行每个位的状态监视,自己做了个全局脚本,如下:
DWORD exter; //定义无符号32位数
exter=GetTagDWord("UDWORD");
SetTagBit("Bool",(exter&0x100));//7st bit
SetTagBit("Bool_8",(exter&0x1));//0st bit
以上执行都可以,Bool,Bool_8分别得到32位数据的第7和第0位数据状态;但我使用:
SetTagBit("Bool_16",(exter&0x1000000));//24st bit
SetTagBit("Bool_24",(exter&0x10000));//16st bit
获得32位数据的第24位和第16位的数据时却没任何反应,请高手解释下,或是可以有什么更好的办法??
最佳答案
每个人理解的第几位意思都不一样,你试试下面的程序:
int i;
DWORD dwValue;
BOOL bRet;
dwValue = GetTagDWord("dwTag");
//printf("\r\n%d",dwValue );
for (i=0;i<32;i++)
{
bRet = (dwValue & (long)pow(2.0,i))== (long)pow(2.0,i);
printf("\r\n第%d位为:%d",i ,bRet);
}
提问者对于答案的评价:
问题已解决,不过用了另一种方法:
DWORD a[32],b,c; //定义32位数据
a[0]=0x00000001;a[1]=0x00000002;a[2]=0x00000004;a[3]=0x00000008;
a[4]=0x00000010;a[5]=0x00000020;a[6]=0x00000040;a[7]=0x00000080;
a[8]=0x00000100;a[9]=0x00000200;a[10]=0x00000400;a[11]=0x00000800;
a[12]=0x00001000;a[13]=0x00002000;a[14]=0x00004000;a[15]=0x00008000;
a[16]=0x00010000;a[17]=0x00020000;a[18]=0x00040000;a[19]=0x00080000;
a[20]=0x00100000;a[21]=0x00200000;a[22]=0x00400000;a[23]=0x00800000;
a[24]=0x01000000;a[25]=0x02000000;a[26]=0x04000000;a[27]=0x08000000;
a[28]=0x10000000;a[29]=0x20000000;a[30]=0x40000000;a[31]=0x80000000;
b=GetTagDWord("Y[0B-3B]_D[2_3]");
c=b&a[0];if(c==a[0]) SetTagBit("Bool",1); else SetTagBit("Bool",0); //0bit
c=b&a[1];if(c==a[1]) SetTagBit("Bool_1",1); else SetTagBit("Bool_1",0); //1bit
c=b&a[2];if(c==a[2]) SetTagBit("Bool_2",1); else SetTagBit("Bool_2",0); //2bit
c=b&a[3];if(c==a[3]) SetTagBit("Bool_3",1); else SetTagBit("Bool_3",0); //3bit
//。
//。
//。
c=b&a[31];if(c==a[31]) SetTagBit("Bool_31",1); else SetTagBit("Bool_31",0); //31bit
大家可以看看,虽然多以点,但比较直观!
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc273257.html