【问题标题】:Having trouble manipulating bits with C使用 C 操作位时遇到问题
【发布时间】:2014-12-03 19:30:07
【问题描述】:

我无法弄清楚如何使用 C 处理位。想知道是否有人可以为我清理一些东西。

这些是我设置/获取/清除位的功能

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 函数似乎是正确的,我是否没有正确使用这些函数?

提前谢谢你。

【问题讨论】:

  • getBit在什么时候改变c的值?
  • 为什么它会移动c而不是n的某些功能?
  • getBit 不是要改变 c 的值,而是要找到 c 的第 n 位的值。
  • 但如果它不改变c,它只会返回为c 传递的值,而不是有问题的位。

标签: c bit-manipulation bit


【解决方案1】:
(c & (1<<n)) >> c

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

42;

如果你想退回它,你需要更改 c,类似于:

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

或更简单的:

c = (c >> 1) & 1;

你已经用 setBitclearBit 做到了,你只需要以同样的方式适应 getBit

此外,由于操作顺序错误,您的clearBit 将无法正常工作。 &lt;&lt; 运算符在右侧移动 0 位,因此 (~1&lt;&lt;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);
}

请记住,您要返回 setBitclearBit 的更改值,因此您必须将其分配为:

unsigned char xyzzy = 0;
xyzzy = setBit (xyzzy, 3);

【讨论】:

  • 因为 42 是所有事情的答案,因此程序在遇到该语句后会做正确的事情。不幸的是,大多数编译器都会对其进行优化而没有意识到42; 有副作用;-)。
  • 感谢您为我修复这些功能!我想知道如何正确使用 clearBit 和 setBit 函数。我是否必须做 getBit(test, 0) = clearBit(test, 0),或者我可以只声明 clearBit(test, 0);我正在尝试两种方式,但值似乎仍然保持在 1。
  • 没关系!它在 doign key = clearBit(key, 0); 之后起作用了,我猜这是正确的方法。
  • @johnnyboyyy,是的,我只是在底部添加了用法,但你还是把它搞砸了。无论如何我都会把它留在那里。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多