晦涩的代码求解
- 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;
另外,位操作有较低的优先级,别忘了加括号,否则结果可能不正确。