从无符号长c中获取序列位

从无符号长c中获取序列位,c,algorithm,if-statement,cryptography,sequence,C,Algorithm,If Statement,Cryptography,Sequence,我想知道是否有人可以帮助我,我只是在学习c,如果我使用了不正确的术语,我提前道歉。我试图实现一个算法,但我在一个特定的部分有一个问题,其中有一个检查比较位序列 算法声明了这个检查 但似乎找不到如何实现if语句部分的示例 unsigned long zprime = 2501328903 unsigned long q0XORq1 = 3736417748; if ( q0XORq1 == zprime ) {

我想知道是否有人可以帮助我,我只是在学习c,如果我使用了不正确的术语,我提前道歉。我试图实现一个算法,但我在一个特定的部分有一个问题,其中有一个检查比较位序列

算法声明了这个检查

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

        unsigned long zprime   = 2501328903
        unsigned long q0XORq1  = 3736417748;

        if ( q0XORq1 == zprime )
        {

        }

所以我想比较q0XORq1上的位8到23和zprime上的位8到23,你可以使用位掩码来进行比较,所以基本上你定义了一个掩码,将位8-23设置为“1”,其余的都设置为“0”,然后在你的值上使用and(&)运算符,这个掩码忽略所有其他部分,比如:

unsigned long zprime   = 2501328903
unsigned long q0XORq1  = 3736417748;

if ( (q0XORq1 & 0xFFFF00) == (zprime & 0xFFFF00) )
{

}
我建议学习C语言中的所有运算符,在这里您有了一个很好的起点:

您可以使用位掩码来执行此操作,因此基本上您定义了一个掩码,将位8-23设置为“1”,将所有其他设置为“0”,然后对值使用and(&)运算符,并使用此掩码忽略所有其他部分,如:

unsigned long zprime   = 2501328903
unsigned long q0XORq1  = 3736417748;

if ( (q0XORq1 & 0xFFFF00) == (zprime & 0xFFFF00) )
{

}
我建议学习C语言中的所有运算符,在这里您有了一个很好的起点:

  • 编写一个函数,该函数返回一个除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。根据需要的位,您需要选择正确的掩码

  • 编写一个函数,该函数返回一个除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。根据需要的位,您需要选择正确的掩码。

    这是否意味着您不关心位1-7和24 rest?我不关心未列出的位,只关心算法中所述的序列是否意味着您不关心位1-7和24 rest?我不关心未列出的位,只有我在书中所说的顺序algorithm@RSahu即使sizeof(in)==64,掩码仍然是0xFFFF00,这个0xFFFF0000000000将设置位的40-55。@koper89,这取决于。如果OP需要最高有效的8-23位,那么我的建议就是他们需要的。@R Sahu只有一个最高有效位,所以说某人想要的X最高有效位在语义上是不正确的。所以我很确定他们不是这个意思。@koper89,最高有效的第8位到最高有效的第23位。@R Sahu公平地说,我不会理解这个问题,或者发现它确实有误导性,因为对我来说,第8位仍然是第8位,即0x100,若你们说从最高有效位开始的第8位到从最高有效位开始的第24位。但这只是主观的,因为这是语义学。这有点像试图说你们想要从最大值中得到值1。与其说您希望最大值减1。@R Sahu即使sizeof(in)==64,掩码仍然是0xFFFF00,这个0xFFFF0000000000将设置位的40-55。@koper89,这取决于具体情况。如果OP需要最高有效的8-23位,那么我的建议就是他们需要的。@R Sahu只有一个最高有效位,所以说某人想要的X最高有效位在语义上是不正确的。所以我很确定他们不是这个意思。@koper89,最高有效的第8位到最高有效的第23位。@R Sahu公平地说,我不会理解这个问题,或者发现它确实有误导性,因为对我来说,第8位仍然是第8位,即0x100,若你们说从最高有效位开始的第8位到从最高有效位开始的第24位。但这只是主观的,因为这是语义学。这有点像试图说你们想要从最大值中得到值1。而不是说你想要最大值减去1。