rgb 值到 php 中的 r、g、b 值
rgb value to r,g,b values in php
我在 php 中完成了一些代码,这是一个关于实现 class 表示颜色的练习。
class 是为了让我可以接收 3 个 'red'、'green' 和 'blue' 值,这不会打扰我,但我也可以收到 'rgb' 值。
最后,这是处理 'rgb' 案例的代码:
if (array_key_exists('rgb', $kwargs))
{
$this->red = intval($kwargs['rgb']) >> 16 & 255;
$this->green = intval($kwargs['rgb']) >> 8 & 255;
$this->blue = intval($kwargs['rgb']) & 255;
}
但是,我真的不明白为什么我们需要'& 255'。
为什么我不能单独使用右移来将值转换回来?
我的意思是,如果我在 'rgb' 中收到:00000001 00000001 00000001,如果我 >> 16,我应该得到 1,如果我 >> 8,我应该得到 1 作为嗯,对吧?
我查了一下'&'运算符,它说它应该充当掩码(如果我正确理解掩码的概念),但是在掩码操作之后,我仍然得到相同的结果和以前一样 (1,1,1)。我不明白为什么这个“& 255”是必需的(我试过没有它,它不起作用)。
感谢所有花时间回答我的人。
你的假设有问题
00000001 00000001 00000001
右移 8 得到 00000001 00000001
这不是您想要的结果....用 255
(11111111
) 掩盖所有设置位,但最低有效字节中的位为 0,给出 00000000 00000001
,这是正确的结果
& 255
是为了确保您只收到此掩码内的值(即前 8 位设置)。这是为了确保您只获得 "R"、"B" 或 "G" 组件,而不是其他任何内容。
示例:
RGB: 11001100 10101010 11110000
RGB >> 16: ???????? ???????? 11001100
& 255: 00000000 00000000 11111111
--------------------------
11001100 (red)
RGB >> 8: ???????? 11001100 10101010
& 255: 00000000 00000000 11111111
--------------------------
10101010 (green)
RGB : 11001100 10101010 11110000
& 255: 00000000 00000000 11110000
--------------------------
11110000 (blue)
所以这些行本质上做的是"shifting"你想要的值到开头并通过屏蔽只获取你感兴趣的部分(前 8 位)。
感谢所有回答的人。我现在明白面具是如何工作的了。
然后回答 Rizier123,是的,代码有效,我通过了练习,我只是要求解释,我讨厌提交部分我不清楚的代码。我收到了表格中的数据:
"decimal int value" 可能后跟“<< 8”或“<< 16”
我只是用位格式来解释我的例子。
我在 php 中完成了一些代码,这是一个关于实现 class 表示颜色的练习。
class 是为了让我可以接收 3 个 'red'、'green' 和 'blue' 值,这不会打扰我,但我也可以收到 'rgb' 值。
最后,这是处理 'rgb' 案例的代码:
if (array_key_exists('rgb', $kwargs))
{
$this->red = intval($kwargs['rgb']) >> 16 & 255;
$this->green = intval($kwargs['rgb']) >> 8 & 255;
$this->blue = intval($kwargs['rgb']) & 255;
}
但是,我真的不明白为什么我们需要'& 255'。
为什么我不能单独使用右移来将值转换回来?
我的意思是,如果我在 'rgb' 中收到:00000001 00000001 00000001,如果我 >> 16,我应该得到 1,如果我 >> 8,我应该得到 1 作为嗯,对吧?
我查了一下'&'运算符,它说它应该充当掩码(如果我正确理解掩码的概念),但是在掩码操作之后,我仍然得到相同的结果和以前一样 (1,1,1)。我不明白为什么这个“& 255”是必需的(我试过没有它,它不起作用)。
感谢所有花时间回答我的人。
你的假设有问题
00000001 00000001 00000001
右移 8 得到 00000001 00000001
这不是您想要的结果....用 255
(11111111
) 掩盖所有设置位,但最低有效字节中的位为 0,给出 00000000 00000001
,这是正确的结果
& 255
是为了确保您只收到此掩码内的值(即前 8 位设置)。这是为了确保您只获得 "R"、"B" 或 "G" 组件,而不是其他任何内容。
示例:
RGB: 11001100 10101010 11110000
RGB >> 16: ???????? ???????? 11001100
& 255: 00000000 00000000 11111111
--------------------------
11001100 (red)
RGB >> 8: ???????? 11001100 10101010
& 255: 00000000 00000000 11111111
--------------------------
10101010 (green)
RGB : 11001100 10101010 11110000
& 255: 00000000 00000000 11110000
--------------------------
11110000 (blue)
所以这些行本质上做的是"shifting"你想要的值到开头并通过屏蔽只获取你感兴趣的部分(前 8 位)。
感谢所有回答的人。我现在明白面具是如何工作的了。
然后回答 Rizier123,是的,代码有效,我通过了练习,我只是要求解释,我讨厌提交部分我不清楚的代码。我收到了表格中的数据:
"decimal int value" 可能后跟“<< 8”或“<< 16”
我只是用位格式来解释我的例子。