用C操作位时遇到问题

时间:2014-10-09 00:58:45

标签: c bit-manipulation bit

我无法弄清楚操纵位是如何与C一起工作的。想知道是否有人可以为我清理一些东西。

这些是我对set / get / clear位的功能

unsigned char getBit(unsigned char c, int n)   
{ 
    (c & (1<<n)) >> c;
    return c;
}

unsigned char setBit(unsigned char c, int n)   
{ 
    c = c |(1<<n);
    return c;
}

unsigned char clearBit(unsigned char c, int n) 
{ 
    c = c & (~1<<n);
    return c;
}

让我们说我有unsigned char test = 3 在二进制中,3是0000 0011

所以,如果我要做printf("THIS IS THE VALUE AT BIT 0 = %hhu \n", getBit(test, 0)); 我认为它会返回1,而是返回test值,即3。

我想知道我是否做错了什么,我的get / set / clear函数似乎是正确的,我没有正确使用这些函数吗?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

只需将您想要的位移到第一个位置即可:

unsigned char getBit(unsigned char c, int n)   
{ 
    return  (c >> n) & 1;
}

答案 1 :(得分:0)

(c & (1<<n)) >> c

是一个完全不更改 c的表达式。它与声明一样有用:

42;

如果您想要返回 c,则需要更改 c = (c & (1<<n)) >> c; ,其中包含以下内容:

c = (c >> 1) & 1;

或更简单:

setBit

您已经使用clearBitgetBit做得很好,您只需要以同样的方式调整clearBit

此外,由于操作顺序错误,您的<<将无法正常工作。 (~1<<4)运算符在右侧移位位,因此11100000实际上是二进制11101111而不是c = c & ~(1 << n); 。相反,您需要确保在位反转之前完成移位:

c

而且,由于我采用极简主义的方法处理代码,我可能会放弃“更改unsigned char getBit(unsigned char c, int n) { return (c >> n) & 1; } unsigned char setBit(unsigned char c, int n) { return c | (1 << n); } unsigned char clearBit(unsigned char c, int n) { return c & ~(1 << n); } 并将其返回”策略以获得更简单的方法:

setBit

请记住,您返回 clearBitunsigned char xyzzy = 0; xyzzy = setBit (xyzzy, 3); 的更改值,因此您必须为其分配以下内容:

{{1}}