需要帮助写一个函数,给我一个数字的所有状态

时间:2014-12-09 09:49:58

标签: c++ c c++11

我有一个192位的号码。我想要两个写一个函数,给我这个数字的所有状态如下:
1)所有状态都有一位1 2)具有两位1的所有状态 3)具有三位1的所有状态 。


依此类推,直到所有位都为1 我也想在一个单独的文件中写下这部分内容。

我刚刚写了所有1位都放在一起的状态。 例如:(对于16位数字) 0000000000000011 ---->然后我将位移到左边。但我找不到一个好方法给我两个状态的所有状态。

(我在C中使用奇迹库这个大数字)

你知道吗? 谢谢你:))

3 个答案:

答案 0 :(得分:0)

我不知道你的功能。但是,如果你有num和shiftLeft和equals函数,它可以像这样

for (int i=0;i<192;i+=2)
{
    num->assing(0b11);
    num->shiftLeft(i*2);
    if (num->andOperand(victim)->equals(num))
    {
        //this is the number has two consecutive 11, and only
    }
    if (num->andOperand(victim)->biggerAndEqual(0b11))
    {
        //this is the number has at least one , two consecutive 11
    }
}

答案 1 :(得分:0)

你可以使用6个for循环(192 / 32bit)循环遍历uint32的所有值 在每个循环中,你可以将uint32乘以某个值,得到正确的值,如下所示:

for(uint32_t i = 0; i < 0xFFFFFFFF; i++) {
    for(uint32_t j = 0; j < 0xFFFFFFFF; j++) {
        bignumber = j + 0xFFFFFFFF*i
        print(bignumber)
    }
}

或者如果你想真的按位进行,你可以在for-loops中做一些bitmasking

答案 2 :(得分:0)

正如问题所述,有((2 ^ 192) - 1)个数字要打印,因为除0之外不包含1位的所有排列都被覆盖。这显然是不可能的,因此问题必须是要求连续的位设置。作为@ n.m.写道,让它先用4位工作。然后将其扩展到192位。要移动一个数字,你加倍。此解决方案无需进行任何位移或乘法即可工作 - 仅通过加法(除了printbits()中的位掩码。

#include<stdio.h>
#define BITS 4

unsigned printmask;

void printbits (unsigned num) {
    int i;
    for (i=0; i<BITS; i++) {
        if (num & printmask)
            printf ("1");
        else
            printf ("0");
        num = num + num;
    }
    printf (" ");
}

int main() {
    unsigned num, bits;
    int m, n;
    printmask = 1;                  // prepare bit mask for printing
    for (n=1; n<BITS; n++)
        printmask = printmask + printmask;

    num = 1;
    for (n=0; n<BITS; n++) {
        bits = num;
        for (m=n; m<BITS; m++) {
            printbits (bits);
            bits = bits + bits;
        }
        printf ("\n");
        num = num + num + 1;
    }
    return 0;
}

节目输出

0001 0010 0100 1000
0011 0110 1100
0111 1110
1111