Примечание: исходный вопрос был отредактирован, и месяц больше не нужен. Первоначальные расчеты были ниже:
Это просто вопрос того, сколько вычислений вы хотите сделать. Самый надежный способ упаковать это, если вы можете сделать свой собственный тип и использовать следующую математику для преобразования из и в соответствующее ему целое число:
Допустимые диапазоны:
Month: 1-12 -> (0-11)+1
Day: 1-31 -> (0-30)+1
Hour: 0-24
Minute: 0-60
Вы можете выбрать порядок хранения значений (я сохраню его в указанном выше порядке).
Month-1 Day-1 Hour Minute
(0-11) (0-30) (0-23) (0-59)
Выполните немного умножения / деления, чтобы преобразовать значения, используя следующую формулу:
value = (((Month - 1) * 31 + (Day - 1)) * 24 + Hour) * 60 + Minute
Итак, у вас есть минимальное значение 0 и максимальное значение ((11*31+30)*24+23)*60+59
, которое составляет 535 679. Таким образом, вам нужно минимум 20 бит, чтобы сохранить это значение как целое число без знака (2^20-1 = 1,048,575; 2^19-1 = 524,287
).
Если вы хотите сделать вещи сложными, но сохранить байт, вы можете использовать 3 байта и манипулировать ими самостоятельно. Или вы можете использовать int (32-бит) и работать с ним, как правило, используя простые математические операторы.
НО там есть место для игры, поэтому давайте посмотрим, сможем ли мы сделать это проще:
Допустимые диапазоны, опять же:
Month: 1-12 -> (0-11)+1 --- 4 bits (you don't even need the -1)
Day: 1-31 -> (0-30)+1 --- 5 bits (you again don't need the -1)
Hour: 0-24 --- 5 bits
Minute: 0-60 --- 6 bits
Это всего 20 бит, и им действительно легко манипулировать. Таким образом, вы ничего не получите, сжимаясь дальше, чем с помощью простого сдвига битов, и вы можете сохранить значение следующим образом:
19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
---Month--- ----Day------- ---Hour--- --Minute---
Если вам наплевать на месяц, самое короткое, что вы можете получить:
value = ((Day - 1) * 24 + Hour) * 60 + Minute
оставляя вас с диапазоном от 0 до 44 639, который может уместиться в 16-битном short
.
Там есть место для игры, поэтому давайте посмотрим, сможем ли мы сделать это проще:
Допустимые диапазоны, опять же:
Day: 1-31 -> (0-30)+1 --- 5 bits (you don't even need the -1)
Hour: 0-24 --- 5 bits
Minute: 0-60 --- 6 bits
Это всего 16 бит, и опять-таки очень легко манипулировать. Так что .... сохраните значение следующим образом:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
----Day------- ---Hour--- --Minute---