所以基本上我需要检查某个比特序列是否出现在其他比特序列(32比特)中。 该函数需要3个参数:
该函数必须返回所需序列开始的位数。例如,如果最后3位0x5出现在0xe1f4中,则为chek。
void bitcheck(unsigned int source, int operand,int n)
{
int i,lastbits,mask;
mask=(1<<n)-1;
lastbits=operand&mask;
for(i=0; i<32; i++)
{
if((source&(lastbits<<i))==(lastbits<<i))
printf("It start at bit number %i\n",i+n);
}
}
答案 0 :(得分:0)
我接受你的意思是你想把n
作为一个位数组,并搜索operand
void bitcheck(uint32_t source, uint32_t operand, unsigned int n) {
uint32_t mask = ~((~0) << n);
uint32_t needle = operand & mask;
int i;
for(i = 0; i <= (32 - n); i += 1) {
if (((source >> i) & mask) == needle) {
/* found it */
break;
}
}
}
最低位的位指定的位序列。看起来你想要执行一个标准的面具&amp;相比;您需要扫描的唯一(次要)并发症。你似乎已经有了这个想法。
我这样写:
source
我和你的细节之间存在一些差异,但主要的功能差异是循环限制:你必须小心忽略你与目标比较的某些位是由移位操作引入的情况,如反对源于stdint.h
,以免你得到误报。我写这种比较的方式让我更清楚(对我来说)应该是什么。
我还使用def histogram():
stars = [10,2,3]
characters = []
for i in stars :
cur_stars = "*" * i
characters.append( cur_stars )
print cur_stars
return characters
>>> stars = histogram()
**********
**
***
中的显式宽度整数数据类型来表示代码依赖于特定宽度的所有值。如果你想编写端口干净的代码,这是一个很好的习惯。
答案 1 :(得分:0)
也许:
if((source&(maskbits<<i))==(lastbits<<i))
由于: 对于旧代码,在11中找到10将是正确的。事实上,当源&#39;来源时,您的原始状态将始终为真。由所有人组成。
答案 2 :(得分:0)
你的循环太过分了,我很害怕。例如,它可以在值~0
中'找到'位模式'0001',它只包含一个。
这样做会更好(我希望):
void checkbit(unsigned value, unsigned pattern, unsigned n)
{
unsigned size = 8 * sizeof value;
if( 0 < n && n <= size)
{
unsigned mask = ~0U >> (size - n);
pattern &= mask;
for(int i = 0; i <= size - n; i ++, value >>= 1)
if((value & mask) == pattern)
printf("pattern found at bit position %u\n", i+n);
}
}