【发布时间】:2017-05-23 00:32:48
【问题描述】:
希望对位运算符有所帮助。练习内容如下:
编写一个名为 bitpat_search() 的函数,用于查找 unsigned int 内指定的位模式的出现。该函数应该接受三个参数,并且应该这样调用:
bitpat_search (source, pattern, n)该函数从最左边的位开始搜索整数“source”,以查看“pattern”的最右边n位是否出现在“source”中。如果找到模式,则让函数返回模式开始的位号,其中最左边的位是数字 0。如果找不到模式,则让函数返回 -1。所以,例如,调用
index = bitpat_search (0xe1f4, 0x5, 3);使 bit_pat(search() 函数在数字 0xe1f4(= 1110 0001 1111 0100 二进制)中搜索三位模式 0x5(= 101 二进制)的出现。该函数返回 11 表示该模式是在以第 11 位开头的“源代码”中找到。
确保函数不对 int 的大小做任何假设。
我遇到了一些问题:
1- 这些数字对我来说实际上没有多大意义......我在每次迭代后都尝试了各种 printf() 函数,看起来 0x5 数字被读取为 100 二进制,这将是四。如果我尝试其他数字,它们会相当随机,但通常是 000,所以.... 不是很有帮助。我算错了吗?右移会以某种方式改变它吗?
2 - 它返回了错误的位置(19 而不是 11),但是虽然我把上面的 q1 数字弄乱了,但它并没有真正起作用,是吗?
对不起,如果这对你们所有可爱的人来说是显而易见的,我只能看到它。 (顺便说一句,我只是想从书中学习,这不是学校的作业)。
谢谢
#include <stdio.h>
int int_size(unsigned int num);
int bit_test(unsigned int word, int position, int size);
int bitpat_search(unsigned int source, unsigned int pattern, int n);
int main(void)
{
int index;
index = bitpat_search(0xe1f4, 0x5, 3);
printf(" Pattern found in position %i\n", index);
return 0;
}
int bitpat_search(unsigned int source, unsigned int pattern, int n)
{
int i, j, tempSource, tempPat, count;
int size = int_size(~0);
for (i = 0; i < size;)
{
count = 0;
for (j = 0; j < n; j++)
{
tempSource = bit_test(source, i, size);
tempPat = bit_test(pattern, j, size);
i++;
count++;
if (tempSource != tempPat)
break;
}
if (count == n)
return i - n;
}
return 0;
}
int bit_test(unsigned int word, int position, int size)
{
if( (word >> (size - position)) & 0x1) // shift bits in word 31 minus n spaces right, and AND word with hexadecimal 1
return 1; // if above is true (1 & 1) return 1
else
return 0;
}
int int_size(unsigned int num)
{
int size = 0;
while (num)
{
size++;
num >>= 1;
}
return size;
}
【问题讨论】:
标签: c bitwise-operators bits