需要帮助编写一个函数,为我提供数字的所有状态

need help for write a function that give me all the states of a number

本文关键字:数字 状态 函数 帮助 一个      更新时间:2023-10-16

>我有一个 192 位的数字。 我想要两个写一个函数,给我这个数字的所有状态,如下所示:
1) 所有状态与一位 1
2) 具有两位的所有状态 1
3) 所有具有三位的状态 1
.
.
.
依此类推,直到所有位均为 1我也想把这部分写在一个单独的文件中。

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

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

你有什么想法吗?谢谢:)

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

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

或者,如果你想按位做这件事,你可以在for循环中做一些位掩码

我不知道你的函数。 但是,如果您有 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
    }
}

正如问题所述,有 ((2 ^ 192) - 1) 数字要打印,因为除了不包含1位之外0所有排列都被覆盖。这显然是不可能的,所以问题必须要求设置连续位。正如 @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