0

如何从位操作的角度理解以下c#代码行

a = 15 & ( a ^ (b << 3));

以及以下代码段中的位操作,尤其是声明uint8_t auint8_t b

  int  decode(const  void*  raw_in,  void*  raw_out,  uint32_t  password,  size_t  len) 
  { 
        ## some code here ##
        const  uint8_t*  in  =  (const  uint8_t*)raw_in; 
        uint32_t  seed  =  password  ^  0x48879c19u; 
        for  (size_t  i  =  0  ;  i  <  len;  ++i)  { 
                uint8_t a = (in[i] << 4) ^ seed;
                 uint8_t b = (((uint32_t)in[i]) << 7 ^ seed) >> 11;

  .......
4

3 回答 3

1
a = 15 & ( a ^ (b << 3));
       |     |    |
       |     |    |_left shift (b's bits left shifted by 3)
       |     |
       |     |_bitwise xor (a XOR result of (b<<3) )
       |
       |_ bitwise and  ( 15 AND result of all above )

同样>>是右移运算符

于 2013-08-09T10:25:35.710 回答
0

至于线

a = 15 & ( a ^ (b << 3));

它需要b并向右移位 3 次(如果b0x01,则变为0x08)。然后将结果和 xor 与a. 然后将该结果用于按位和 with 15(从而屏蔽除最低四位以外的所有内容)并将结果分配给a.

对于其他代码,我可以准确地解释它在操作方面的作用,就像我在上面所做的那样,但这里很少有人能够解释它的含义

于 2013-08-09T10:22:30.220 回答
0

b 是一个 8 位值

b << 3 是向左移动 3 位的值

然后将其与 a 进行异或运算。如果相应的位不同,则给出 1,如果它们相同,则给出 0。

然后将该值与 15 进行按位与运算,即 00001111,因此最低有效四位保持不变,最高有效 4 为零。

于 2013-08-09T10:23:09.337 回答