gpt4 book ai didi

单位与多位的 c 位操作

转载 作者:太空宇宙 更新时间:2023-11-04 02:13:32 25 4
gpt4 key购买 nike

我试图在单个字符中表示一堆值:前 6 位中有 6 个开/关标志,并使用最后 2 位来保存 4 个不同的值。这看起来太基础了,像这样的宏一定存在于某处,但我找不到它们。

 #define HOT 0x00
#define BIG 0x01
#define FAT 0x02
#define HIT 0x03
#define BAT 0x04
#define ZAX 0x05
#define HOW 0x06

#define TWO_BITS nnn // ???
#define CONDITION_0 nnn // bit combo: 00
#define CONDITION_1 nnn // bit combo: 01
#define CONDITION_2 nnn // bit combo: 10
#define CONDITION_3 nnn // bit combo: 11

void bitter(void)
{
unsigned char myBits = 0;
bool nonsense;

if (myBits & BIG) nonsense = true; // BIG flag on
if (!(myBits & BAT)) nonsense = false; // BAT flag off

myBits = myBits | BIG; // turn on BIG bit
myBits = myBits & ~BIG; // turn off BIG bit

if (TWO_BITS == CONDITION_0)
doThis();
else if (TWO_BITS == CONDITION_1_)
doThat();
// ... etc

}

那么用最后 2 位编码我想做什么的最佳方式是什么? 我无法进行任何性能测试,因为我还没有弄清楚如何编写代码,但我假设这是执行此类操作的最快方法。

[顺便说一句,这可能闻起来像作业,但我只是一只 54 岁的狗,正在努力学习一些新技巧。]

最佳答案

这在某种程度上取决于您是否需要单独处理这 2 位,作为 0 到 3 之间的(十进制)值,或者您是否始终将它们视为字节的高 2 位。

这是一种方法,我们只是屏蔽掉所有其他位,并将条件定义为这 2 位将作为字节中高 2 位的值。

 #define TWO_BITS(x) ((x) & 0xC0)

#define CONDITION_0 0
#define CONDITION_1 0x40 // bit combo: 01
#define CONDITION_2 0x80 // bit combo: 10
#define CONDITION_3 0xC0 // bit combo: 11

即一个字节的高2位是二进制的1 1 0 0 0 0 0 0,即十六进制的0xC0。高 2 位为 0 1 ,即一个字节中的所有位为 0 1 0 0 0 0 0 0 ,即十六进制的 0x40。

你的测试必须是

if (TWO_BITS(myBits) == CONDITION_0)

另一种方法是将高 2 位提取为 2 位整数(即 0 到 3 之间的值)。这很简单,只需将位向右移动 6 位即可。

 #define TWO_BITS(x) ((x) >> 6)

#define CONDITION_0 0x0
#define CONDITION_1 0x01 // bit combo: 01
#define CONDITION_2 0x02 // bit combo: 10
#define CONDITION_3 0x03 // bit combo: 11

测试其中一个条件时用法相同。

 if (TWO_BITS(myBits) == CONDITION_0)

最后请注意,您的低 6 位标志似乎有点错误,请考虑例如

#define HOW 0x06

0x06 是二进制值 0 0 0 0 0 1 1 0 ,所以这实际上是打开或测试 2 位。您可能希望将 1 个位与 1 个标志相关联,这将是这个序列

 #define BIG 0x01
#define FAT 0x02
#define HIT 0x04
#define BAT 0x08
#define ZAX 0x10
#define HOW 0x20

这通常写为位移位,因此很容易读取它是哪一位:

 #define BIG (1 << 0)  //bit zero
#define FAT (1 << 1) //bit 1
#define HIT (1 << 2) //bit 2
#define BAT (1 << 3) //bit 3 , etc.
#define ZAX (1 << 4)
#define HOW (1 << 5)

关于单位与多位的 c 位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com