【问题标题】:What does this following expression mean?下面这个表达式是什么意思?
【发布时间】:2013-08-02 15:16:04
【问题描述】:

此表达式取自 Leptonica(图像处理库)中的内置函数“l_setDataByte”。

这是链接:http://tpgit.github.io/Leptonica/arrayaccess_8c_source.html(此处为第 260 行)

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

【问题讨论】:

    标签: image-processing bitwise-operators xor typecast-operator leptonica


    【解决方案1】:

    我的猜测:

    • line 是指向无符号 8 位(字节)(l_uint8 *)line 的指针
    • one 操作行中的第 n 个字节:(l_uint8 *)line + n --> y(y 是指针)
    • 但是,在转换为非单整数指针后,也可以对地址的最后 2 位进行异或操作:(l_uintptr_t)y ^ 3 --> z(z 是指针)
    • 最后一个转换回一个无符号字节点并将值val写在那里:*(l_uint8 *)z = val

    编辑: ^3 用于解决字节的排列(即小端与大端)。数字 0x12345678 可以通过两种方式放入连续字节中:0x12、0x34、0x56、0x78(这是大端)或 0x78、0x56、0x34、0x12(小端)。 XOR 将从大端寻址(见第 274 行)切换到小端寻址(第 276 行)。这取决于处理器,源代码以一种或另一种方式编译。

    【讨论】:

    • 如果我们异或地址的最后两位会发生什么?我知道 ...11 变为 ...00,...10 变为 ...01,...01 变为 ...10 并且 ...00 变为 ...11 但是,他为什么要这样做?
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2020-10-23
    • 2012-05-07
    相关资源
    最近更新 更多