C 编程位表示
Posted
技术标签:
【中文标题】C 编程位表示【英文标题】:C Programming bit representation 【发布时间】:2012-01-27 22:56:25 【问题描述】:例如,我有 3 个计数器(我本质上想将它们表示为真值(计数器 > 0 为真;否则为假)。这导致我的真值有 2^3 = 8 个排列,如下所示:
000 001 010 011 100 101 110 111
然后每个排列映射到一个状态。如何将这些计数器转换为位级别的二进制表示,然后如何使用开关结构中的二进制表示映射到状态? (例如,001 映射到“包含 x”,010 映射到“包含 y”,而 011 将映射到“包含 x 和 y”。这是否也可以移植到其他操作系统?
【问题讨论】:
这是用于嵌入式系统还是什么?否则,如果你坚持使用字节值,而不是像这样的东西摆弄位,你可能会更好(即更容易理解/维护代码)。 是的...我基本上想使用尽可能少的内存。因此,在我的三个计数器(x、y、z)中,假设 x 和 z > 0(真)。这意味着我想用 3 位来表示 101。然后可以很容易地对照 switch 语句进行检查 【参考方案1】:一种可能性是使用对应于每个计数器的每个位的值来定义常量:
#define CTR1_BIT 0x01
#define CTR2_BIT 0x02
#define CTR3_BIT 0x04
然后根据计数器值(零或非零)设置位。 |
运算符执行按位逻辑或运算(请参阅this for more information)。如果ctr1
不为零,它只设置变量state
中的最低位。如果ctr2
不为零,则它将state
中的第二位设置为1,而其他位保持不变。等等
int state = 0;
if ( ctr1 )
state |= CTR1_BIT;
if ( ctr2 )
state |= CTR2_BIT;
if ( ctr3 )
state |= CTR3_BIT;
然后打开可能的状态值:
switch ( state )
case 0x00:
printf( "state 0\n" );
break;
case 0x01:
printf( "state 1\n" );
break;
case 0x02:
...
case 0x07:
printf( "state 7\n" );
break;
default:
printf( "Invalid state\n" );
assert(0);
【讨论】:
十六进制的好主意!我是 C 新手,所以我有 2 个问题。 1) 除了 int 之外,我还能使用什么来使用更少的字节?我知道一个 char 是 1 个字节。 2) Hex 需要多少字节? @CodeKingPlusPlus:由于您只代表 7 个州,char
也可以工作(单字节)。如果您处于内存受限的环境中,那可能是有道理的。十六进制值只是常量;只是一种不同风格的整数表示。对于这种情况,它似乎更具可读性。但由于这些值都是
你能解释一下按位或赋值吗?我不太明白它是如何工作的。假设我们有 ctr1 和 ctr2 为真。你能引导我完成评估过程吗?如:比特=比特| 0x1 因此位现在为 1,位 = 位 | 0x2 位现在是 ??
@CodeKingPlusPlus:我添加了更多描述性文字,希望能够解释它。基本上,使用带有所选常量值(0x01、0x02、0x04 ... 2 的幂)的按位或运算符,允许将特定的单个位设置为 1(如果它还不是一个)。
谢谢,非常感谢。这很奇怪,但真的很酷,可以通过编程达到比特级别!以上是关于C 编程位表示的主要内容,如果未能解决你的问题,请参考以下文章
[编程题] ** 两个整数二进制位不同个数 **(拓展++)