繁体   English   中英

单 Pipe "|" 在 C function 中使用移位运算符返回

[英]Single Pipe "|" with Shift Operators in C function return

在这里,我有一个 function 需要一个字节,交换它的一半并返回结果:

unsigned char   swap_bits(unsigned char octet)
{
    return ((octet >> 4) | (octet << 4));
}

实现的效果如下:

  1 byte
_____________
 0100 | 0001
     \ /
     / \
 0001 | 0100

单Pipe | 在这里用作按位或运算符? 在这种情况下,它如何与 Shift 运算符<<>>协作/工作? 我可以用逻辑或运算符替换它吗|| 还是别的什么? 谢谢!

编辑:这是我在 StackOverflow 上的第一个问题,我在短时间内收到了很多很好的答案。 我很感激他们所有人!

是的,它是按位或运算符。 这就是|的唯一含义 C 中的操作员。

左移和右移运算符将字节的每个 4 位一半(也称为“半字节”)移动到另一半。 如果你从

0100 | 0001

然后octet << 4结果

0001 | 0000

octet >> 4结果

0000 | 0100

请注意,当您执行这些移位中的每一个时, 0000会转移到另一个半字节。 所以当你把所有东西都放在一起时,你只会得到两个移动的小点。

单Pipe | 在这里用作按位或运算符?

是的,它是 C 中的按位或运算符。

在这种情况下,它如何与 Shift 运算符 << 和 >> 协作/工作?

在这段代码中有相当多的“字里行间”。

给定一些数据0xAB>> 4结果为0x0A<< 4结果为0xAB0 重要的是要意识到 C 中的大多数运算符都带有隐式 integer 提升,并且移位实际上是在int类型上进行的。

所以| 运算符获取传递给它的int类型的操作数和0x0A | 0xAB0 0x0A | 0xAB0 = 0xABA

最后在返回期间,还有另一个隐式转换回unsigned char ,称为“左值转换”。 这就像使用=的赋值一样,其中=的右操作数被转换为左操作数的类型。 在我的示例中,这会导致0xABA被截断为0xBA

这种缩小转换可以被认为是转换“好像模数比类型可以容纳的最大值多 1”。 也就是说,0xABA % (255+1) = 0xBA。 发生这种情况与丢弃除最低有效字节之外的所有内容相同。

我可以用逻辑或运算符替换它吗|| 还是别的什么?

没有。 || 将其 arguments 评估为零或非零,并像 Boolean 一样返回 integer 01 而按位| 将两个操作数合并在一起,就像二进制加法一样。 例如 0001b + 0010b = 0011b。 因此,要回答问题的第二部分, +通常类似于按位或,但使用+阅读代码更容易混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM