You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:27:28