如何修改有符号数的后3位
How to modify the last 3 bits of signed numbers
当我在图像上应用函数 dwt2()
时,我得到了四个子带系数。通过选择四个子带中的任何一个,我使用带符号数的二维矩阵。
在这个矩阵的每个值中,我想在最后 3 个最低有效位中嵌入 3 位信息,即十进制数字 0 到 7。但是,当我处理负数时,我不知道该怎么做。如何修改系数?
首先,你想使用一个Integer Wavelet Transform,所以你只需要处理整数。这将允许您在两个空格之间进行无损转换,而无需舍入浮点数。
在整数中嵌入位对于二元运算来说是一个简单的问题。通常,您要使用模式
(number AND mask) OR bits
bitwise AND operation clears out the desired bits of number
, which are specified by mask
. For example, if number
is an 8-bit number and we want to zero out the last 3 bits, we'll use the mask 11111000. After the desired bits of our number
have been cleared, we can substitute them for the bits
we want to embed using the bitwise OR操作。
接下来,你需要知道有符号数是如何represented in binary的。请务必阅读二进制补码部分。我们可以看到,如果要清除最后 3 位,我们要使用掩码 ...11111000,它始终为 -8。这与我们是否使用 8、16、32 或 64 位来表示我们的有符号数无关。通常,如果要清除有符号数的最后 k
位,掩码必须是 -2^k
.
让我们用一个简单的例子把所有的东西放在一起。首先,我们为系数子带和嵌入比特流生成一些数字。由于系数值可以取 [-510, 510] 中的任何值,我们将使用 'int16'
进行运算。比特流是 [0, 7] 范围内的数字数组,因为这是 [000, 111] 的十进制范围。
>> rng(4)
>> coeffs = randi(1021, [4 4]) - 511
coeffs =
477 202 -252 371
48 -290 -67 494
483 486 285 -343
219 -504 -309 99
>> bitstream = randi(8, [1 10]) - 1
bitstream =
0 3 0 7 3 7 6 6 1 0
我们通过覆盖必要的系数来嵌入比特流。
>> coeffs(1:numel(bitstream)) = bitor(bitand(coeffs(1:numel(bitstream)), -8, 'int16'), bitstream, 'int16')
coeffs =
472 203 -255 371
51 -289 -72 494
480 486 285 -343
223 -498 -309 99
然后我们可以使用简单的掩码 ...00000111 = 7 来提取比特流。
>> bitand(coeffs(1:numel(bitstream)), 7, 'int16')
ans =
0 3 0 7 3 7 6 6 1 0
当我在图像上应用函数 dwt2()
时,我得到了四个子带系数。通过选择四个子带中的任何一个,我使用带符号数的二维矩阵。
在这个矩阵的每个值中,我想在最后 3 个最低有效位中嵌入 3 位信息,即十进制数字 0 到 7。但是,当我处理负数时,我不知道该怎么做。如何修改系数?
首先,你想使用一个Integer Wavelet Transform,所以你只需要处理整数。这将允许您在两个空格之间进行无损转换,而无需舍入浮点数。
在整数中嵌入位对于二元运算来说是一个简单的问题。通常,您要使用模式
(number AND mask) OR bits
bitwise AND operation clears out the desired bits of number
, which are specified by mask
. For example, if number
is an 8-bit number and we want to zero out the last 3 bits, we'll use the mask 11111000. After the desired bits of our number
have been cleared, we can substitute them for the bits
we want to embed using the bitwise OR操作。
接下来,你需要知道有符号数是如何represented in binary的。请务必阅读二进制补码部分。我们可以看到,如果要清除最后 3 位,我们要使用掩码 ...11111000,它始终为 -8。这与我们是否使用 8、16、32 或 64 位来表示我们的有符号数无关。通常,如果要清除有符号数的最后 k
位,掩码必须是 -2^k
.
让我们用一个简单的例子把所有的东西放在一起。首先,我们为系数子带和嵌入比特流生成一些数字。由于系数值可以取 [-510, 510] 中的任何值,我们将使用 'int16'
进行运算。比特流是 [0, 7] 范围内的数字数组,因为这是 [000, 111] 的十进制范围。
>> rng(4)
>> coeffs = randi(1021, [4 4]) - 511
coeffs =
477 202 -252 371
48 -290 -67 494
483 486 285 -343
219 -504 -309 99
>> bitstream = randi(8, [1 10]) - 1
bitstream =
0 3 0 7 3 7 6 6 1 0
我们通过覆盖必要的系数来嵌入比特流。
>> coeffs(1:numel(bitstream)) = bitor(bitand(coeffs(1:numel(bitstream)), -8, 'int16'), bitstream, 'int16')
coeffs =
472 203 -255 371
51 -289 -72 494
480 486 285 -343
223 -498 -309 99
然后我们可以使用简单的掩码 ...00000111 = 7 来提取比特流。
>> bitand(coeffs(1:numel(bitstream)), 7, 'int16')
ans =
0 3 0 7 3 7 6 6 1 0