首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

晦涩的代码求解解决方案

2012-06-04 
晦涩的代码求解C/C++ codeunsigned int posfloat dir0.3pos((dir0.0)?(static_castunsigned int(-d

晦涩的代码求解

C/C++ code
unsigned int pos;float dir=0.3;pos=((dir<0.0)?(static_cast<unsigned int>(-dir * 32767.0 + 0.5)):(0x80000000+static_cast<unsigned int>(dir*32767.0 + 0.5)));

0x80000000的作用是什么,不用0x80000000代码怎么写?要求不影响结果的前提下尽量用纯浮点数,最后再转换成unsigned int。

C/C++ code
unsigned int dir;...if ( !( dir&0x7fffffff ) ){continue;}if ( dir[stepLoop]&0x80000000 )...currSteps = static_cast<unsigned int>(              1 + (endVal - pos)/(dir&0x7fffffff));

0x7fffffff,0x80000000作用是什么,出现在条件判断中有什么意义?

C/C++ code
unsigned int w2X,w1X,w1Y,w1Xw1Y ,pos ;w2X = (pos&0x7fff);   w1X = (~w1X&0x7fff);  w1Xw1Y = (0x4000+(w1X*w1Y))>>15;

0x7fff,0x4000的意义?请不吝指教,谢谢!

[解决办法]
if ( !( dir&0x7fffffff ) ){
continue;
}
if ( dir[stepLoop]&0x80000000 )

...

currSteps = static_cast<unsigned int>(
1 + (endVal - pos)/(dir&0x7fffffff));


0x7fffffff,0x80000000作用是什么,出现在条件判断中有什么意义?

我们知道在32位编译器,一个无符号整数的最大值为 2^31-1. 0x7fffffff的2进制表示为最高位为0,其余31比特位1,而0x80000000的2进制表示为,最高bit为1,其余31bit为0.
if ( !( dir&0x7fffffff ) ),dir&0x7fffffff保留了低31bit而清除了最高bit.,if ( !( dir&0x7fffffff ) ) 表示dir的低31比特为0.
( dir[stepLoop]&0x80000000 ) 表示dir[stepLoop]的最高比特是1.
[解决办法]
热心回复,共同提高,其中一个问题,楼上已经解决,这里补充一下,楼主详细可搜索C语言位运算,

位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表:
运算符含义描述
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

C/C++ code
w2X = (pos&0x7fff);   w1X = (~w1X&0x7fff);  w1Xw1Y = (0x4000+(w1X*w1Y))>>15;
[解决办法]
初学者一般不熟悉位操作,但其实在许多情况下,都需要用到位操作,特别是嵌入式领域。
位操作用的比较多的是&(与)和|(或),前者用了清位,如要清除高位,仅仅保留低2位,则写为

mask=3; //3=2^2-1 3=(1<<2)-1, 一般的,要只保留低k位,可写为mask=(1<<k)-1;
m= (n & mask); // 仅仅m的低2位保留下来了。
  
再如要判断一个数除以4是否等于0,可写成
"if ( (n & 3)==0)"

如果想把某一位设置为1,而其他bit不同,可这样做
mask=(1<<k),
n= (n | mask)
如想把bit2置为1,则可写成 n |=4;

另外,位操作有较低的优先级,别忘了加括号,否则结果可能不正确。

热点排行