我有一个192位的号码。我想要两个写一个函数,给我这个数字的所有状态如下:
1)所有状态都有一位1
2)具有两位1的所有状态
3)具有三位1的所有状态
。
。
。
依此类推,直到所有位都为1
我也想在一个单独的文件中写下这部分内容。
我刚刚写了所有1位都放在一起的状态。 例如:(对于16位数字) 0000000000000011 ---->然后我将位移到左边。但我找不到一个好方法给我两个状态的所有状态。
(我在C中使用奇迹库这个大数字)
你知道吗? 谢谢你:))答案 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