如何根据位操作
理解以下c#代码行a = 15 & ( a ^ (b << 3));
以及以下代码段中的位操作,尤其是声明uint8_t a
和uint8_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;
.......
答案 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
并将其右移三次(如果b
为0x01
则会变为0x08
)。然后使用a
获取结果和xors。然后,该结果用于按位和15
(从而屏蔽掉除最低四位之外的所有内容)并将结果赋给a
。
对于其他代码,我可以准确地解释它在操作方面的作用,就像我上面所做的那样,但是很少有人可以解释它的含义。
答案 2 :(得分:0)
b是8位值
b&lt;&lt; 3是该值向左移动3次
然后将其与a进行异或运算。如果相应的位不同则给出1,如果它们相同则给出0。
然后将该值与15进行逐位AND运算,即00001111,因此最低有效4位保持不变,最高有效4位为零。