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 编程位表示的主要内容,如果未能解决你的问题,请参考以下文章

C/C++编程知识:整型数据在内存中的存储!讲解+示例

Linux C高级编程——网络编程

QT开发(五十)——QT串口编程基础

[编程题] ** 两个整数二进制位不同个数 **(拓展++)

C++编程如何保留小数点后6位 求高手精解.....这里提前表示感谢了!!!

C语言编程:寻找特殊整数