Я читал о порядке байтов с прямым порядком байтов и наткнулся на эти концепции
long long number
(((number & 0x00000000000000ff) << 56) +
((number & 0x000000000000ff00) << 40) +
((number & 0x0000000000ff0000) << 24) +
((number & 0x00000000ff000000) << 8) +
((number & 0x000000ff00000000) >> 8) +
((number & 0x0000ff0000000000) >> 24) +
((number & 0x00ff000000000000) >> 40) +
((number & 0xff00000000000000) >> 56 ))
что в основном это делает?
Когда я компилирую его, используя (gcc -lrt -lm имя_программы). Я получаю предупреждение
integer constant is too large for ‘long’ type
Этот код выполняет переключение между прямым и прямым порядком байтов для 64-битного типа данных без знака.
Посмотрите на первое подвыражение:
(number & 0x00000000000000ff) << 56
Это маскирует биты 0-7 и сдвигает их влево на 56. Таким образом, они теперь занимают биты 56-63.
И следующее подвыражение:
(number & 0x000000000000ff00) << 40
Это маскирует биты 8-15 и сдвигает их влево на 40. И так далее, и так далее.
Если бы писал код, я бы использовал побитовое или, |
, а не арифметическое сложение, +
, так как это выглядит лучше, на мой взгляд.
Других решений пока нет …