关于位操作的代码行

时间:2013-08-09 10:15:38

标签: c bit-manipulation

如何根据位操作

理解以下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;

  .......

3 个答案:

答案 0 :(得分: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 )

同样>>是右移算子

答案 1 :(得分:0)

至于行

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

它需要b并将其右移三次(如果b0x01则会变为0x08)。然后使用a获取结果和xors。然后,该结果用于按位和15(从而屏蔽掉除最低四位之外的所有内容)并将结果赋给a

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

答案 2 :(得分:0)

b是8位值

b&lt;&lt; 3是该值向左移动3次

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

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