我无法弄清楚操纵位是如何与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函数似乎是正确的,我没有正确使用这些函数吗?
提前谢谢。
答案 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
您已经使用clearBit
和getBit
做得很好,您只需要以同样的方式调整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
请记住,您返回 clearBit
和unsigned char xyzzy = 0;
xyzzy = setBit (xyzzy, 3);
的更改值,因此您必须为其分配以下内容:
{{1}}