读书人

100分请问一个宏定义的有关问题

发布时间: 2012-02-23 22:01:34 作者: rapoo

100分请教一个宏定义的问题!
#define TIMER_SLOTS x
我想如果x不是2的N次方就重新#define TIMER_SLOTS 为 仅比X大的2的N次方的数。


#define TIMER_SLOTS 4
什么都不做
#define TIMER_SLOTS 5
#undef TIMER_SLOTS
#define TIMER_SLOTS 8

怎么实现呀

[解决办法]
我觉得用洪实现这个功能有点复杂,你看下能否直接放到函数里面实现.
[解决办法]
可以写个函数实现,在函数里判断并根据条件重新定义TIMER_SLOTS;
在程序的开始调用那个函数
[解决办法]
//寻找num的最高位
#define FIND(num, pos) do\
{\
pos = 0;\
while(num/(1 < <pos) > 0)pos++;\
} while(0);

//修改 x ,另x=2^n
#define TIMER_SLOTS(x) do\
{\
int pos;\
FIND(x, pos);\
((1 < <(pos-1)) == x)?(x=x):(x=(1 < <pos));\
} while(0);

int main()
{
int i=7;
TIMER_SLOTS(i);
cout < <i < <endl; //i=8
return 0;
}
[解决办法]
int i=7;
TIMER_SLOTS(i);

int timers[i]; //这里用 i 定义就是了 ...
[解决办法]
直接写个函数不就好了。。。
[解决办法]
#include "math.h "

#define TIMER_SLOTS 5


#ifdef TIMER_SLOTS
const double t = TIMER_SLOTS;
#undef TIMER_SLOTS
#define TIMER_SLOTS (int)pow(2.0, (double)(int)ceil(log(t) / log(2.0)))
#endif

void main()
{
int n = TIMER_SLOTS;
cout < <n < <endl;

}

[解决办法]
#define TIMER_SLOTS(x) \
do{\
if((x) & ((x)-1))\ /*说明不是2的n次方*/
{\
x = x +1;\
}\
}while((x) & ((x)-1))/*是2的n次方的时候这个值为0,会退出*/

看看这样如何? 我没有验证过,可以验证一下 :)

[解决办法]
#include <stdio.h>
#define G(i, n) do{n = sizeof(i)*8;while(n--){ if(i> > n) break; }}while(0)
#define TIMER_SLOTS(i, n) G(i,n); i^(1 < <n)? i =1 < <(n+1) : i;

void main()
{
int i = 0x1, j, m ;
FILE* fp;
fp = fopen( "test.txt ", "wb ");
for( i = 0; i < 128; i++ )
{
j = i;
TIMER_SLOTS(j, m);
printf( "Sour=%d, Dest=%d\n\r ", i, j);
fprintf(fp, "Sour=%d, Dest=%d\n\r ", i, j);
}
fclose(fp);
}
[解决办法]
直接> 比较好了不要用&了
[解决办法]
#define TIMER_SLOTS(x) do\
{\
if((x) & ((x)-1))\
{\
while((x & (x-1)))\
x=((x) & ((x)-1));\
x = x < <1;\
}\
} while(0);
高手能不能讲下什么意思! 我也搭车学习一下

读书人网 >C语言

热点推荐