Algorithm 给定一个字节中的8位,如何找到该字节中一个或多个位翻转后产生的所有可能的数字
我使用一个字节变量来存储颜色组合。每个位位置的值表示一种颜色。因此,通过打开字节中的一个或多个位,可以将颜色组合持久化到内存变量 我正在寻找一种算法,以生成[字节的一个或多个位]处于开启或关闭状态的所有可能组合,但所有位关闭(即0)除外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
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