从无符号长c

时间:2016-12-07 19:33:27

标签: c algorithm if-statement cryptography sequence

我想知道是否有人可以帮助我我只是在学习c而且如果我使用错误的条款,我会提前道歉。我正在尝试实现一个算法,但我在一个特定部分遇到问题,其中有一个检查比较一个比特序列。

算法说明了这项检查。

algorithm if check

但似乎无法找到如何实现if语句部分的示例。

        unsigned long zprime   = 2501328903
        unsigned long q0XORq1  = 3736417748;

        if ( q0XORq1 == zprime )
        {

        }

所以我想将q0XORq1上的第8位到第23位与zprime上的第8位到第23位进行比较

2 个答案:

答案 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)

  1. 编写一个函数,该函数返回一个数字,其中除了第8-23位以外的所有数字都被关闭。

    unsigned long getTransformedNumber(unsigned long in);
    
  2. 在比较数字时使用该功能。

    if ( getTransformedNumber(q0XORq1) == getTransformedNumber(zprime) )
    {
       ...
    }
    
  3. 您可以将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。根据需要的位数,您需要选择正确的掩码。