C中的位操作

use*_*755 2 c bit-manipulation

所以,如果我有一个32位的整数.前28位(左起)用于存储内存块的大小,接下来的两个是0,后两个是:

  • 存储它是否是最后一个节点然后
  • 存储是否使用(分别).

我想要做的是知道如何在isLast操作和isUsed操作上打开和关闭标志.

(如果我们只考虑最后两个整数(再次,我们从左开始)那么01将不是最后一个并且例如用于,例如,另一个例子是11是最后一个并且被使用,00不是最后一个并且没有被使用.)

我希望能够以一种简单的方式打开和关闭标志.我知道我需要使用包括&和|的位操作 但我不知道怎么做.

如果您需要更多问题描述,请向我提问.

And*_*nck 11

//turn on isUsed
data |= 1;
//turn off isUsed
data &= ~1;
//turn on notLast
data &= ~2;
//turn off notLast
data |= 2;
Run Code Online (Sandbox Code Playgroud)

  • 与原始问题相比,您的最后一个标志似乎倒退了。换句话说,`data |= 2` 打开最后一个标志,`data &= ~2` 关闭它。 (2认同)

Jes*_*per 9

这很简单:

/* Turn on bit 0 */
code = code | 1;

/* Turn off bit 0 */
code = code & ~1;

/* Turn on bit 1 */
code = code | 2;

/* Turn off bit 1 */
code = code & ~2;
Run Code Online (Sandbox Code Playgroud)

有关适当的术语,请参阅C或Google中的按位运算符.你可以在关于C的任何书籍或教程中找到这个.


Vic*_*cky 5

通常,将最低有效位计为0,设置位N,需要将原始值与1 << N进行OR运算.

例如设置第1位:

val |= (1 << 1);
Run Code Online (Sandbox Code Playgroud)

要清除位N,需要将原始值与1 << N的逐位倒数进行AND运算.

例如清除第1位:

val &= ~(1 << 1);
Run Code Online (Sandbox Code Playgroud)