Algorithm 给定一个字节中的8位,如何找到该字节中一个或多个位翻转后产生的所有可能的数字

Algorithm 给定一个字节中的8位,如何找到该字节中一个或多个位翻转后产生的所有可能的数字,algorithm,computer-science,pascal,Algorithm,Computer Science,Pascal,我使用一个字节变量来存储颜色组合。每个位位置的值表示一种颜色。因此,通过打开字节中的一个或多个位,可以将颜色组合持久化到内存变量 我正在寻找一种算法,以生成[字节的一个或多个位]处于开启或关闭状态的所有可能组合,但所有位关闭(即0)除外 const GREEN = 1; //binary 1 RED = 2; //binary 10; BLUE = 4; //binary 100; ORANGE = 8; //binary 1000; VIOLET = 16; //binar

我使用一个字节变量来存储颜色组合。每个位位置的值表示一种颜色。因此,通过打开字节中的一个或多个位,可以将颜色组合持久化到内存变量

我正在寻找一种算法,以生成[字节的一个或多个位]处于开启或关闭状态的所有可能组合,但所有位关闭(即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
值的总和


回到您的问题,您需要做的唯一一件事是创建除value
0000\u 0000
之外的所有字节值。您可以创建一个以1(
0000_0001
)开始,然后计数到255的计数器。结果变量将遍历所有可能的值。通常,在编程语言中,只需声明一个字节变量即可(在Pascal中:
color:byte;
),然后使用
color=color+1
color++
如果您的语言支持此功能。声明、加法和检查
都只是一个for循环。所有可用8位(即1字节)表示的数字都是0-255。如果要排除00000000,则为1-255。这是基本的二进制算法。还是我在这里遗漏了什么?问题到底是什么?我不太清楚,组合的数量是
(2^8)-1
(减去全零),数字正好是从
1
2^8-1
的所有数字<代码>2^8
256
@DennisTraub Ok。。现在我明白了。有255种可能的组合,结果正好是值1-255。我想这应该解决了我的问题。唷!谢谢伟大的我很乐意提供帮助。“从左到右对位进行编号”对于表示2的幂的位,编号从0开始,从右(LSB)到左(MSB)。这取决于字节的位顺序,通常在规范中使用big-endian。而且,通常也使用基于1的索引,在这种情况下,位被编号为
b8
b1
,具有
b8
最高阶位。然而,这确实使计算变得不必要的复杂,因此我决定使用
b0
b7
。我的回答,我的命令:P