给定n个字节的数据,计算不同的位数组可能性

时间:2014-02-12 02:59:26

标签: java math byte combinations permutation

如果我有 N 个字节的数据,我该如何计算可能的不同组合? 我的第一个想法是,因为每个字节实际上只有8个,所以我应该计算出唯一可能的位组。

所以我把它放在Java中:

private void bytePossibilities(int numberOfBytes) {
    final int BITS_IN_A_BYTE = 8;        
    final int numberOfBits = numberOfBytes * BITS_IN_A_BYTE;        
    long totalPossibilities = 0;
    for (int i = 0; i < (1 << numberOfBits); i++) {
        int[] next = new int[numberOfBits];
        for (int j = 1, a = 1; j < (1 << numberOfBits); j <<= 1, a++) {
            next[numberOfBits - a] = (i & j) == 0 ? 0 : 1;
        }
        System.out.println(Arrays.toString(next));
        totalPossibilities++;
    }
    System.out.println(totalPossibilities + " combinations found for "+ numberOfBytes  +" bytes");
}

这似乎有用......

bytePossibilities(1)
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
...252 other combinations...
[1, 1, 1, 1, 1, 1, 1, 0]
[1, 1, 1, 1, 1, 1, 1, 1]
256 combinations found for 1 bytes


bytePossibilities(2)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
...65532 other combinations...
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
65536 combinations found for 2 bytes

因此,给出 N 字节数据的明显可能性是2 ^(字节* 8)。 我只是想确保我正确地做到了这一点。似乎极端的是,任何2个随机字节的数据(彼此相邻)完全相同的几率是65,536中的1和任何3个字节,在16,777,216中为1。

如果有人能够更多地了解这一点,我会很感激。

2 个答案:

答案 0 :(得分:1)

除了你的上一次发言外,你是对的

两个随机字节相同的概率是1(256)(第一个字节可以是任何东西,但第二个字节必须与第一个字节相同)。另一种思考方式 - 有256对相同的字节和256 *(1/65536)= 1/256。

你可以将它扩展到三个字节...当你查看三个随机字节的任何序列并想知道它们都是相同的概率时,你真的要问&#34;概率是多少?第二个和第三个与第一个相同&#34;?答案是(1/256)*(1/256)。

实际上字节不会发生&#34;随机&#34; - 特别是在未压缩数据中存在重要模式,因此对于大多数文件类型,这些概率不会转换为对等和三元组的等效观察频率。

答案 1 :(得分:0)

你是对的。每个数据位都可以有两个值(0或1)之一。所以,如果你有一位,有两种可能性。如果你有两个位,第一位有2位,第二位有2位,所以2 * 2 = 2 ^ 2。继续这个想法,你有一个字节的2 ^ 8种可能性和k字节的2 ^(k * 8)。

这只是使用产品规则,其中指出如果您有 a 方法来执行一项任务,并且 b 方式可以执行另一项任务事情,这两个任务是独立的,那么如果你做两个任务,你有 a * b 完成这两个任务的方法。希望这是有道理的。