C++ 测试位是否在数字中重复
我在循环所有长度的I位字符串,想知道如何判断它是否是一个 重复先前的位字符串?基本上我想跳过C++ 测试位是否在数字中重复,c++,bit-manipulation,C++,Bit Manipulation,我在循环所有长度的I位字符串,想知道如何判断它是否是一个 重复先前的位字符串?基本上我想跳过11,1010,1111,0101,101101等,但不想跳过1011,1100,1000,101001等 这些位字符串是二进制数的周期,因此如果它们重复,它将生成相同的数字,这将抛出我的数据处理程序 重复序列需要相邻,并覆盖所有j,无溢出 skip = false; for(int i = 1; i<=n/2 && !skip; i++){ if(n
11
,1010
,1111
,0101
,101101
等,但不想跳过1011
,1100
,1000
,101001
等
这些位字符串是二进制数的周期,因此如果它们重复,它将生成相同的数字,这将抛出我的数据处理程序
重复序列需要相邻,并覆盖所有j
,无溢出
skip = false;
for(int i = 1; i<=n/2 && !skip; i++){
if(n%i == 0){
skip = true;
for(int k=1; k<=n/i; k++) {
if(((j&(j >> (i*k)))&((1<<i) - 1)) != (j&((1<<i) - 1))){
skip = false;
break;
}
}
}
}
if(skip) continue;
skip=false;
对于(inti=1;i(i*k))&(1你可以用完全不同的方式做你想做的事
查看十进制数字以减少混淆。例如,数字4545是数字45的重复。要检测到这一点,可以除以101,然后看到结果小于100
在c++中:
if (j % 101 == 0 && j / 101 < 100)
if(j%101==0&&j/101<100)
现在将底座10替换为底座2:
if (j % 5 == 0 && j / 5 < 4)
if(j%5==0&&j/5<4)
如果位数不是2而是n
- 用
1代替4你可以用完全不同的方式做你想做的事
查看十进制数字以减少混淆。例如,数字4545是数字45的重复。要检测到这一点,可以除以101,然后看到结果小于100
在c++中:
if (j % 101 == 0 && j / 101 < 100)
if(j%101==0&&j/101<100)
现在将底座10替换为底座2:
if (j % 5 == 0 && j / 5 < 4)
if(j%5==0&&j/5<4)
如果位数不是2而是n
- 将4替换为
1重复的模式可能只显示为n的除数的大小
所以对于n
偶数,很简单,只需检查两个半位,看看它们是否相同
bool does_bits_repeat(int n, unsigned b)
{
if (n % 2 == 0) {
const unsigned high = b >> (n / 2);
// (high & b) is equivalent to (high & low)
return (high & b) == high;
} else {
// ...
}
}
奇数部分比较棘手。你必须找到n
并使用k
from
unsigned k = 1;
for (int i = 0; i != n; i += d) {
k = k << d | 1;
}
// for n == 15, we have
// d == 1, k = binary 111111111111111 (1 repeated 15 times)
// d == 3, k = binary 001001001001001 (001 repeated 5 times)
// d == 5, k = binary 000010000100001 (00001 repeated 3 times)
无符号k=1;
对于(int i=0;i!=n;i+=d){
k=k重复模式可能只出现一个大小,该大小是n
的除数
所以对于n
偶数,很简单,只需检查两个半位,看看它们是否相同
bool does_bits_repeat(int n, unsigned b)
{
if (n % 2 == 0) {
const unsigned high = b >> (n / 2);
// (high & b) is equivalent to (high & low)
return (high & b) == high;
} else {
// ...
}
}
奇数部分比较棘手。你必须找到n
并使用k
from
unsigned k = 1;
for (int i = 0; i != n; i += d) {
k = k << d | 1;
}
// for n == 15, we have
// d == 1, k = binary 111111111111111 (1 repeated 15 times)
// d == 3, k = binary 001001001001001 (001 repeated 5 times)
// d == 5, k = binary 000010000100001 (00001 repeated 3 times)
无符号k=1;
对于(int i=0;i!=n;i+=d){
k=k仍然不知道这意味着什么:“重复上一个位字符串”skip==true;
什么都不做继续;
在循环之外什么也不做,而您似乎不知从哪里拉出了变量j
。我们需要更多的信息,了解您正在尝试做什么,以及j
和i
是什么。如果它在循环内部重复,那么它是否等于在循环内部重复多次的其他位字符串。(ex 1010是10重复两次)sry dude,仍然不清楚你想要什么我想清楚,所以不要去投票“不清楚”。读得更好。仍然不知道这意味着什么:“重复上一个位字符串”skip==true;
什么都不做。if(skip)继续;
在循环之外什么也不做,而您似乎不知从哪里拉出了变量j
。我们需要更多的信息,了解您正在尝试做什么,以及j
和i
是什么。如果它在循环内部重复,那么它是否等于在循环内部重复多次的其他位字符串。(ex 1010是10重复两次)sry dude,你还不清楚你想让我清楚什么,所以不要去投票“不清楚”。读得更好。我需要检查所有iSo的I
位字符串的重复,如果我理解正确,那么它的代码将是if(j*((1我需要检查所有iSo的i
位字符串的重复性,如果我理解正确,那么它的代码将是if(j*)((1