Как сделать битманипуляцию с большим количеством значений без нескольких масок? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть это задание, и я не уверен, как это сделать, и простой Google не поможет мне. Также не совсем уверен, что искать.

Но я создаю часы / часы, которые содержат часы, минуты и секунды. И битовая маска, которую мне дано использовать:

0000 0000 mask1
hhhh mmmm
0000 0000 mask2
mmss ssss

До сих пор я понял, что количество битов в часах является причиной для выбора 12 вариантов от 0 до> 11. И 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 часов), чтобы я мог реализовать это в своем коде и выяснить это самостоятельно.

1 Ответ

2 голосов
/ 22 апреля 2020

при условии, что все значения находятся в пределах диапазона, и использование unsigned типов ...

для отмены кодирования

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

для кодирования

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