В настоящее время я пытаюсь узнать, как решить проблему для задания.

• В классе хранятся отработанные часы, hours, долгое время, представляющее собой упакованную версию часов.

  • значение часа составляет от 0,0 до 24,0 (один десятичный знак)

  • Часовая запись * 10 находится в диапазоне от 0 до 240. Она удобно помещается в беззнаковый байт.

  • long может содержать 8 байтов.

  • hours - это длинное число с 7 младшими байтами, установленными для масштабированных записей часов (или децичасов, если это помогает). Часы субботы хранятся в крайнем правом байте: формат выглядит как 00-FR-TH-WE-TU-MO-SU-SA, где каждые две буквы представляют один байт, сверху вниз.

Мой вопрос в том, как мне это сделать? Как мне сохранить определенное значение от 0 до 240 в определенном месте байта в long и убедиться, что они остаются отдельными?

Спасибо.

0
studentatbcit 26 Ноя 2020 в 07:26

1 ответ

Лучший ответ

В Java нет беззнаковых типов. Объявите long на каждый день недели. Используйте операторы, чтобы сдвинуть значение каждого дня на желаемый байт. положение, а затем используйте [побитовое] или , чтобы объединить день с другой переменной long, которая хранит всю неделю.

long saturday = 17;
long sunday = 18;
long monday = 19;
long tuesday = 20;
long wednesday = 21;
long thursday = 22;
long friday = 23;
long week = (saturday * 10) | ((sunday * 10) << 8)
                            | ((monday * 10) << 16)
                            | ((tuesday * 10) << 24)
                            | ((wednesday * 10) << 32)
                            | ((thursday * 10) << 40)
                            | ((friday * 10) << 48);

Чтобы получить значение каждого дня, выполните противоположные действия с переменной week. Например, чтобы получить значение понедельника, сдвиньте значение для week вправо, чтобы значение понедельника заняло младшие значащие биты, а затем выполните [побитовое] и , чтобы получить фактическое значение. Поскольку это значение умножается на десять, просто разделите на десять, и вы получите исходное значение, как показано:

long mon = ((week >> 16) & 0xFF) / 10;
1
Abra 26 Ноя 2020 в 05:05