【发布时间】:2014-08-20 19:30:46
【问题描述】:
我想知道这个函数实际上执行了什么。 据我了解,它应该返回 pSrc[1]。
那么为什么它会将 pSrc[0] 左移 8 位,这会将这 8 位清零。 当这些零与 pSrc[1] 进行 OR 运算时,pSrc[1] 不会受到影响,因此无论如何您都会得到 pSrc[1],就好像按位 OR 从未发生过一样。
/*
* Get 2 big-endian bytes.
*/
INLINE u2 get2BE(unsigned char const* pSrc)
{
return (pSrc[0] << 8) | pSrc[1];
}
这个函数来自dalvik虚拟机的源码。 https://android.googlesource.com/platform/dalvik/+/android-4.4.4_r1/vm/Bits.h
更新:
好的,现在我明白了,这要感谢这里的所有答案。
(1) pSrc[0] 原本是一个无符号字符(1 字节)。
(2) 当它用 int 类型的字面量 8 左移 (pSrc[0]
(3) pSrc[0]
(4) 当它被 ORed 时(步骤 (3) | pSrc[1] 的中间结果),pSrc[1] 然后被 int-promoted 为有符号的 int(4 个字节)。
(5) ( 步骤 (3) 的中间结果 | pSrc[1]) 的结果将前两个最低有效字节保留为我们想要的方式,其中两个最高有效字节全部为零。
(6) 通过将结果返回为 u2 类型,仅返回前两个最低有效字节以获得 2 个大端字节。
【问题讨论】:
标签: c++ c bit-manipulation bit-shift