每2位字对符号

时间:2019-07-29 05:03:43

标签: c

我有一个功能,可以一点一点地读取一个单词并转换为符号:

我需要帮助将其更改为每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 - !

2 个答案:

答案 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)

假设wordunsigned 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按位与,结果右移以获得前两位的值。比较这些位以获得结果。