此代码以范围x的整数0,127作为输入,返回一个由4个32位整数组成的数组,其中设置了x位。
我正在尝试最大限度的切换,以便更容易地过滤掉输出中的波纹。另一个考虑是要快速运行,因为这段代码运行在MCU上(确切地说,是XMOS)。
尽管此代码按预期工作,但我并不100%相信这是好代码。
static inline unsigned int genMask(unsigned int x)
{
unsigned int ret=0;
ret|=(x&0x00000001)?0x80000000:0;//x 1/32
ret|=(x&0x00000002)?0x00008000:0;//5 1/32
ret|=(x&0x00000004)?0x00800080:0;//4 1/16
ret|=(x&0x00000008)?0x08080808:0;//3 1/8
ret|=(x&0x00000010)?0x22222222:0;//2 1/4
ret|=(x&0x00000020)?0x55555555:0;//1 1/2
return ret;
}
static inline void genPWM(unsigned int *p, unsigned int xm)
{
unsigned int temp = genMask(xm>>1);
p[0] = temp;
p[1] = temp;
p[2] = genMask(((xm>>1)&0xfffffffe)|(xm&0x00000001));
p[3] = genMask((xm>>1)&0xfffffffe);
}发布于 2015-10-21 18:36:49
您目前正在使用几乎相同的参数三次调用gen_mask():
genMask(xm>>1);
genMask(((xm>>1)&0xfffffffe)|(xm&0x00000001));
genMask((xm>>1)&0xfffffffe);注意,在每种情况下,只有0x1位是不同的。因此,您可以首先生成它的0x1位清除:
genMask((xm>>1)&0xfffffffe);然后你可以根据它们的0x1位来计算其他的。
所以你的代码会变成:
static inline void genPWM(unsigned int *p, unsigned int xm)
{
unsigned int temp1 = genMask((xm>>1) & 0xfffffffe);
unsigned int temp2 = temp1 | ((xm & 1) ? 0x80000000 : 0);
unsigned int temp3 = temp1 | ((xm & 2) ? 0x80000000 : 0);
p[0] = temp3;
p[1] = temp3;
p[2] = temp2;
p[3] = temp1;
}https://codereview.stackexchange.com/questions/108303
复制相似问题