Что означает это следующее выражение?
Это выражение взято из встроенной функции "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). Это зависит от процессора, и источник компилируется так или иначе.