如何在没有多个掩码的情况下对更多值进行位操作?

How to do bitmanipulation with more values without multiple masks?

我有这个任务,但我不知道该怎么做,简单的 google 对我没有帮助。也不确定要搜索什么。

但我正在创建一个包含小时、分钟和秒的时钟/手表。 我要使用的位掩码是:

0000 0000 mask1
hhhh mmmm
0000 0000 mask2
mmss ssss

到目前为止我的理解是小时位的数量是适合从 0 -> 11 的 12 个选项的原因。 以及 6 位的分钟和秒为 0 -> 59.

几个小时以来,我有点在黑暗中为每个可能的小时创建 12 个单独的位掩码。完成后,我意识到我还必须这样做几分钟和几秒钟,这将是 120 行不必要的代码。

这是我做的:

  TIME_11_HOUR = 240, //1111
  TIME_10_HOUR = 224, //1110
  TIME_9_HOUR = 192,  //1100
  TIME_8_HOUR = 160,  //1010
  TIME_7_HOUR = 144,  //1001
  TIME_6_HOUR = 112,  //0111
  TIME_5_HOUR = 96,   //0110
  TIME_4_HOUR = 80,   //0101
  TIME_3_HOUR = 64,   //0100
  TIME_2_HOUR = 48,   //0011
  TIME_1_HOUR = 32,   //0010
  TIME_0_HOUR = 16    //0001 0000

我认为解决方案与移位有关,但我不太确定该怎么做。

任何人都可以给我一个将 0001(0 小时)更改为 1010(8 小时)的示例,以便我可以在我的代码中实现它并自己弄清楚。

假设所有值都在范围内并使用 unsigned 类型...

取消编码

hour = (encodedtime & 0xf000) >> 12;
minute = (encodedtime & 0xfc0) >> 6;
second = encodedtime & 0x3f;

编码

encodedtime = (hour << 12) | (minute << 6) | second;