Image processing 下面这个表达是什么意思?
此表达式取自Leptonica(图像处理库)中的内置函数“l_setDataByte” 这是链接:(这里是第260行) 我猜:Image processing 下面这个表达是什么意思?,image-processing,bitwise-operators,xor,typecast-operator,leptonica,Image Processing,Bitwise Operators,Xor,Typecast Operator,Leptonica,此表达式取自Leptonica(图像处理库)中的内置函数“l_setDataByte” 这是链接:(这里是第260行) 我猜: 行是指向无符号8位(字节)(l_uint8*)行的指针 操作行中的第n个字节:(l_uint8*)行+n-->y(y是指针) 但是,在强制转换为非单整数指针后,还可以对地址的最后2位进行异或运算:(l_uintptpr_t)y^3-->z(z是指针) 最后,返回到一个无符号字节点,并将值val写入其中:*(l_uint8*)z=val 编辑: ^3用于处理字节的排列
- 行是指向无符号8位(字节)
(l_uint8*)行的指针
- 操作行中的第n个字节:
-->y(y是指针)(l_uint8*)行+n
- 但是,在强制转换为非单整数指针后,还可以对地址的最后2位进行异或运算:
-->z(z是指针)(l_uintptpr_t)y^3
- 最后,返回到一个无符号字节点,并将值
写入其中:val
*(l_uint8*)z=val
^3用于处理字节的排列(即小端与大端)。数字0x12345678可以两种方式放入连续字节:0x12、0x34、0x56、0x78(这是大端数)或0x78、0x56、0x34、0x12(小端数)。异或将从大端寻址(见第274行)切换到小端寻址(第276行)。这取决于处理器,并且源代码以某种方式编译。如果我们对地址的最后两位进行异或运算,会发生什么情况?我知道…11变成…00,…10变成…01,…01变成…10,…00变成…11但是,他为什么这么做?
*(l_uint8 *)((l_uintptr_t)((l_uint8 *)line + n) ^ 3) = val;