[英]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 0
或1
。 而按位|
将两个操作数合并在一起,就像二进制加法一样。 例如 0001b + 0010b = 0011b。 因此,要回答问题的第二部分, +
通常类似于按位或,但使用+
阅读代码更容易混淆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.