C语言中单竖线|与移位运算符在函数返回中的作用及替代疑问
问题解答
1. 单竖线|确实是按位或运算符
没错,这里的|就是C语言里的按位或运算符,它会对两个操作数的每一位逐一进行或操作:只要对应位有一个是1,结果的该位就是1;只有两位同时为0时,结果位才是0。
2. 和移位运算符的配合逻辑
我们拆解swap_bits函数的执行步骤就能明白:
octet >> 4:将输入字节向右移4位,把原字节的高4位挪到低4位的位置,此时结果的高4位全为0。比如原字节是01000001(十进制65),右移4位后得到00000100(十进制4)。octet << 4:将输入字节向左移4位,把原字节的低4位挪到高4位的位置,此时结果的低4位全为0。还是用上面的例子,左移4位后得到00010000(十进制16)。- 用
|合并两个结果:因为两个移位后的结果,有效位(非0的位)完全不重叠,按位或操作会把两部分的1都保留下来,最终得到00010100(十进制20),刚好完成高低半部分的交换。
简单说就是移位负责把高低半部分挪到目标位置,按位或负责把这两部分无缝拼接起来,不会出现位冲突。
3. 能不能替换成逻辑或||或其他运算符?
- 绝对不能替换成逻辑或
||:逻辑或||是用来判断表达式的真假(非0为真,0为假),返回的是布尔值(1或0)。比如上面的例子,(octet >>4)和(octet <<4)都是非0值,||的结果是1,完全不是我们要的交换后的字节值。 - 可以用加法
+替代吗?因为两个移位结果的有效位不重叠,用(octet >>4) + (octet <<4)也能得到相同结果,但按位或更能体现“拼接二进制位”的意图,可读性更好,所以更推荐用|。
内容的提问来源于stack exchange,提问作者Yiyang
相关产品推荐
相关产品推荐

