Что означает это следующее выражение?

Это выражение взято из встроенной функции "l_setDataByte" в Leptonica(библиотека обработки изображений).

Вот ссылка: http://tpgit.github.io/Leptonica/arrayaccess_8c_source.html (Линия-260 здесь)

*(l_uint8 *)((l_uintptr_t)((l_uint8 *)line + n) ^ 3) = val;

1 ответ

Моя догадка:

  • строка - указатель на 8-битный знак без знака (байт) (l_uint8 *)line
  • манипулирует n-ным байтом в строке: (l_uint8 *)line + n -> у (у указатель)
  • однако один также XORs последние 2 бита адреса после приведения в качестве незапятнанного целочисленного указателя: (l_uintptr_t)y ^ 3 -> z (z - указатель)
  • наконец, один возвращается к неподписанным байтовым точкам и записывает значение val там: *(l_uint8 *)z = val

Редактировать: ^3 предназначен для адресации байтов (то есть немного против старшего байта). Число 0x12345678 может быть помещено в последовательные байты двумя способами: 0x12, 0x34, 0x56, 0x78 (это big endian) или 0x78, 0x56, 0x34, 0x12 (little endian). XOR переключится с адресации с прямым порядком байтов (см. Строку 274) на порядковый номер с прямым порядком байтов (строка 276). Это зависит от процессора, и источник компилируется так или иначе.

Другие вопросы по тегам