我想知道是否有人可以帮助我我只是在学习c而且如果我使用错误的条款,我会提前道歉。我正在尝试实现一个算法,但我在一个特定部分遇到问题,其中有一个检查比较一个比特序列。
算法说明了这项检查。
但似乎无法找到如何实现if语句部分的示例。
unsigned long zprime = 2501328903
unsigned long q0XORq1 = 3736417748;
if ( q0XORq1 == zprime )
{
}
所以我想将q0XORq1上的第8位到第23位与zprime上的第8位到第23位进行比较
答案 0 :(得分:3)
你使用位掩码这样做,所以基本上你定义了一个掩码,它将8-23位设置为'1'而其余的都设置为'0',然后你使用AND(&)运算符对你的值和这个掩码忽略了所有其他部分,例如:
unsigned long zprime = 2501328903
unsigned long q0XORq1 = 3736417748;
if ( (q0XORq1 & 0xFFFF00) == (zprime & 0xFFFF00) )
{
}
我建议你学习C语言中的所有操作符,这里有个好的开始: https://www.tutorialspoint.com/cprogramming/c_operators.htm
答案 1 :(得分:-1)
编写一个函数,该函数返回一个数字,其中除了第8-23位以外的所有数字都被关闭。
unsigned long getTransformedNumber(unsigned long in);
在比较数字时使用该功能。
if ( getTransformedNumber(q0XORq1) == getTransformedNumber(zprime) )
{
...
}
您可以将getTransformedNumber
实施为:
unsigned long getTransformedNumber(unsigned long in)
{
unsigned long mask = 0;
if ( sizeof(in) == 32 )
{
mask = 0xFFFF00;
}
else if ( sizeof(in) == 64 )
{
mask = 0xFFFF0000000000;
}
else
{
// Make sure to deal with the case where sizeof(in) is
// different from 32 and 64.
assert(0);
}
return (mask & in);
}
关于第8-23位的澄清
对于32位无符号长整数,8-23位是中间16位。因此,掩码0x00FFFF00
可以毫无困惑地工作。
然而,对于64位无符号长整数,位8-23的概念尚不清楚。如果使用掩码0x0000000000FFFF00
,则从右侧选择位8-23。如果使用蒙版0x00FFFF0000000000
,则从左侧选择位8-23。根据需要的位数,您需要选择正确的掩码。