给定一个字节中的8位,如何查找由于翻转此字节中的一个或多个位而导致的所有可能的数字

问题描述

我正在使用字节变量来存储颜色组合。每个位位置的值代表一种颜色。因此,通过打开字节中的一个或多个位,可以将颜色的组合保留到存储变量中。

我正在寻找一种算法来生成[字节的一个或多个位]处于开或关状态的所有可能组合,所有位均处于关闭状态。 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位后的字节的样子:

The byte

解决方法

可以认为一个字节代表一个无符号数字0..255。这些分别由值0000_00001111_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)。