在C中n个位的2^n个状态上循环n>;32
我想在C中有一个循环,覆盖所有可能的n位的2^n状态。例如,如果n=4,我想循环0000、0001、0010、0011、…、1110、1111。位可以用任何方式表示,例如,长度为n的整数数组的值为0或1,或长度为n的字符数组的值为“0”或“1”,等等,这并不重要 对于较小的n,我要做的是使用整数算术计算x=2^n(n和x都是整数),然后在C中n个位的2^n个状态上循环n>;32,c,loops,while-loop,C,Loops,While Loop,我想在C中有一个循环,覆盖所有可能的n位的2^n状态。例如,如果n=4,我想循环0000、0001、0010、0011、…、1110、1111。位可以用任何方式表示,例如,长度为n的整数数组的值为0或1,或长度为n的字符数组的值为“0”或“1”,等等,这并不重要 对于较小的n,我要做的是使用整数算术计算x=2^n(n和x都是整数),然后 for(i=0;i32)这种方法显然不适用于long 如果n>32,我将如何工作 具体地说,我真的需要计算2^n吗,或者是否有一种巧妙的方法来编写循环,它不引用
for(i=0;i32)这种方法显然不适用于long
如果n>32,我将如何工作
具体地说,我真的需要计算2^n吗,或者是否有一种巧妙的方法来编写循环,它不引用2^n的实际值,而是迭代2^n次?对于n>32,请使用无符号长时间
。这将适用于n到64次。对于接近50次的值,仍然需要等待长时间直到循环结束。不清楚为什么你说如果n>32,它显然不起作用。你关心的是位的宽度,还是运行时间
如果您关心数字宽度,请调查一个大型数学库,例如
如果你担心运行时间…如果宽度足够大,你的循环就无法完成,所以要有不同的爱好;)说真的。。。计算出循环中一次迭代的大致运行时间,然后将其乘以40亿,再除以20年,就可以估计出需要等待答案的祖先的代数;它可以使用uint64\u t
声明32位整数。当你迭代完它的所有值后,再来问第二个问题。所有整数都有它们的位。要获取您使用的任何整数的位n
,i&(1如果我是uint64\u t类型,这是否有效?如果n>32,我的方法不起作用,因为我使用整数(或长)算术。如果n>32,则从2^n(整数或长算术)得到的结果将是垃圾。@Daniel只需使用我的answer@Daniel,这就是我建议使用大型数学库的原因。使用大型数学库,您将不会使用任何标量类型,这样您就不会被锁定为64位的最大宽度。无论如何,您将没有足够的时间使用现代CPU迭代32位。但是sizeof(unsigned long-long)与sizeof(long)相同,那么这有什么帮助呢?unsigned long-long在我见过的所有编译器上都是64位的,另一方面,long可能是32位或64位,具体取决于编译器和体系结构。还请记住,您必须以稍微不同的方式获取位。例如unsigned long a=1;a&(1谢谢,最后一部分还不清楚。如何获取无符号长变量y的x位?@Daniel您需要对无符号长数字执行位运算。所以使用(a&(1)但50可以吗?它不需要是50ULL?
for(i=0;i<x;i++) {
bits = convert_integer_to_bits( i );
work_on_bits( bits );
}