这个按位运算执行什么操作?

Sud*_*shi 1 c steganography bit-shift bitwise-operators

我最近一直在做一些项目,我一直想进入隐写术。我查了几种方法来做到这一点,但其中一种我不太明白。

(image[i][j].red & ~0x3) | ((file[f] & 0x60) >> 5); 
(image[i][j].green & ~0x3) | ((file[f] & 0x18) >> 3); 
(image[i][j].blue & ~0x7) | ((file[f] & 0x7));
Run Code Online (Sandbox Code Playgroud)

我得到了它的一部分,比如 & ~0x3 和 & ~0x7 分别将红色/绿色的最后 2 位和蓝色的最后 3 位归零,但真正让我感兴趣的是 file[f] & 0x60, 0x18 , 和 0x7。file是一个从二进制文件中读入的无符号字符数组,image是一个 rgb 矩阵,每个组件有 3 个无符号字符,分别代表红色、绿色和蓝色。顺便说一下,这一切都在 C 中。提前致谢

ike*_*ami 5

  • 它将 的最低有效 2 位替换为 的第red6 位和第 5 位file[f]
  • 它将 的最低有效 2 位替换为 的第green4 位和第 3 位file[f]
  • 它用 的第blue2、1 和 0 位替换 的最低有效 3 位file[f]

例如

          +---+---+---+---+---+---+---+---+
file[f]   | h | g | f | e | d | c | b | a |
          +---+---+---+---+---+---+---+---+

          +---+---+---+---+---+---+---+---+
& 0x60    | 0 | g | f | 0 | 0 | 0 | 0 | 0 |
          +---+---+---+---+---+---+---+---+

          +---+---+---+---+---+---+---+---+
>> 5      | 0 | 0 | 0 | 0 | 0 | 0 | g | f |
          +---+---+---+---+---+---+---+---+


          +---+---+---+---+---+---+---+---+
red       | H | G | F | E | D | C | B | A |
          +---+---+---+---+---+---+---+---+

          +---+---+---+---+---+---+---+---+
& ~0x3    | H | G | F | E | D | C | 0 | 0 |
          +---+---+---+---+---+---+---+---+


          +---+---+---+---+---+---+---+---+
|         | H | G | F | E | D | C | g | f |
          +---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

想象每种颜色都是 0 到 255 之间的三个值的组合。白色是 255,255,255;黑色为 0,0,0;亮红色为255,0,0;亮黄色为255,255,0;等等。

现在假设我们更改了替换这些数字的最低有效数字,以便我们最终使用 252,3,5 而不是 255,0,0。你会注意到不同吗?也许不吧。