问题描述
我正在使用字节变量来存储颜色组合。每个位位置的值代表一种颜色。因此,通过打开字节中的一个或多个位,可以将颜色的组合保留到存储变量中。
我正在寻找一种算法来生成[字节的一个或多个位]处于开或关状态的所有可能组合,所有位均处于关闭状态。 0。
const
GREEN = 1; //binary 1
RED = 2; //binary 10;
BLUE = 4; //binary 100;
ORANGE = 8; //binary 1000;
VIOLET = 16; //binary 10000;
YELLOW = 32; //binary 100000;
CYAN = 64; //binary 1000000;
WHITE = 128; //binary 10000000;
这是打开所有8位后的字节的样子:
解决方法
可以认为一个字节代表一个无符号数字0..255。这些分别由值0000_0000
和1111_1111
表示。每一位代表2的特定幂。让我们用索引b_i
从左到右对位进行编号。然后,这些位在打开时代表值v_i = 2 ^ b_i
,在不打开时代表零。然后,数字就是所有v_i
值的加法。
回到您的问题,您唯一需要做的就是创建除值0000_0000
之外的所有字节值。您可以创建一个以1(0000_0001
)开头的计数器,然后计数到255。结果变量将遍历所有可能的值。通常,您可以使用编程语言声明一个字节变量来执行此操作(在Pascal中:color: byte;
it seems),然后使用color = color + 1;
或color++
(如果您使用的语言)支持这一点。当然,声明<= 255
的添加,添加和检查都可以放在for
循环中。
一个棘手的问题是如何将不同的颜色组合成一种新的颜色?特别是WHITE
的包含是令人讨厌的。尽管如今专业人士正在使用其他色彩空间,但通常我们只使用红色绿色和蓝色(RGB)。