我正在尝试理解 CRC-32 算法。是否有一个等效的表达式:
y = (X >> 31) ^ (data >> 7);
使用&
,类似于
y = (x & 0x8000) ^ (data & 0x800)
嗯,这取决于你的计算,但在位操作中,每个运算符(operator)都有自己做事的动机。不同的运算可以得到相同的答案,但这并不意味着运算符彼此等价。每个运营商都有不同的动机来实现。
bit a bit b a & b (a AND b) a | b (a OR b) a ^ b (a XOR b)
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
<< 和 >> 的目的是从计算中清除位/丢弃位
右移
右移运算符的符号是>>。对于它的操作,它需要两个操作数。它将其左操作数中的每一位向右移动。运算符后面的数字决定了移位的位数(即右操作数)。因此,通过执行 ch >> 3,所有位都将向右移动三个位置,依此类推。
i = 14; // Bit pattern 1110
j = i >> 1; // bit pattern shifted 1 thus we get 111 = 7 = 14/2
左移
左移运算符的符号是<<。它将其左侧操作数中的每一位向左移动右侧操作数指示的位置数。它的工作原理与右移运算符相反。因此,通过在上面的示例中执行 ch << 1,我们得到 11001010。生成的空格由上面的零填充。
左移可用于乘以 2 的倍数的整数,如下所示:
int i = 4; /* bit pattern equivalent is 100 */
int j = i << 2; /* makes it 10000, original number by 4 i.e. 16 */
我是一名优秀的程序员,十分优秀!