如何在不使用多个掩码的情况下使用更多值进行位操作?

问题描述 投票:0回答:1

我有这份作业,我不确定该怎么做,一个简单的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小时)的示例,以便我可以在代码中实现并自行解决。

c bit-manipulation bitmask byte-shifting
1个回答
2
投票

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

取消编码

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

编码

encodedtime = (hour << 12) | (minute << 6) | second;
© www.soinside.com 2019 - 2024. All rights reserved.