我有一个功能,可以一点一点地读取一个单词并转换为符号:
我需要帮助将其更改为每2位读取一次并更改为符号。 我没有主意,需要您的帮助。
void PrintWeirdBits(word w , char* buf){
word mask = 1<<(BITS_IN_WORD-1);
int i;
for(i=0;i<BITS_IN_WORD;i++){
if(mask & w)
buf[i]='/';
else
buf[i]='.';
mask>>=1;
}
buf[i] = '\0';
}
所需符号:
00 - *
01 - #
10 - %
11 - !
答案 0 :(得分:0)
这是我对您的问题的建议。
使用查找表进行符号解码将消除对if
语句的需求。
(我假设word
是16位无符号数据类型)
#define BITS_PER_SIGN 2
#define BITS_PER_SIGN_MSK 3
#define INIT_MASK (BITS_PER_SIGN_MSK << (BITS_IN_WORD - BITS_PER_SIGN))
void PrintWeirdBits(word w , char* buf)
{
static const char signs[] = {'*', '#', '%', '!'};
unsigned mask = INIT_MASK;
int i;
int sign_idx;
for(i=0; i < BITS_IN_WORD / BITS_PER_SIGN; i++)
{
// the bits of the sign represent the index in the signs array
// just need to align these bits to start from bit 0
sign_idx = (w & mask) >> (BITS_IN_WORD - (i + 1)*BITS_PER_SIGN);
// store the decoded sign in the buffer
buf[i] = signs[sign_idx];
// update the mask for the next symbol
mask >>= BITS_PER_SIGN;
}
buf[i] = '\0';
}
Here似乎有效。
只要它是2的幂(1、2、4、8)且小于BITS_IN_WORD
的幂,就可以毫不费力地将其更新为该符号的任何位宽的通用代码。
答案 1 :(得分:0)
假设word
是unsigned int
或无符号整数类型。
void PrintWeirdBits(word w , char* buf){
word mask = 3 << (BITS_IN_WORD -2);
int i;
word cmp;
for(i=0;i<BITS_IN_WORD/2;i++){
cmp = (mask & w) >> (BITS_IN_WORD -2 -2i);
if(cmp == 0x00)
{
buf[i]='*';
}
else if (cmp == 0x01)
{
buf[i]='#';
}
else if (cmp == 0x02)
{
buf[i]='%';
}
else
{
buf[i]='!';
}
mask>>=2;
}
buf[i] = '\0';
}
重要的是
cmp = (mask & w) >> (BITS_IN_WORD -2 -2i);
这里mask
和输入w
按位与,结果右移以获得前两位的值。比较这些位以获得结果。