[面经] Meta Coding:32 位整数按字节翻转(热身题)高频题
冷目灼灼的扁豆
[面经] Meta Coding:32 位整数按字节翻转(热身题)
最近面了 Meta,分享一下 coding 轮的题目。这是热身题。
题目
实现
题目本身不难,真正考的是位操作熟不熟。掩码和移位用得顺手的话,这就是一行代码的事;不顺手,就得有个 plan B,一个字节一个字节地拼,而不是同时摆弄四个掩码。
方法 A:逐字节循环(保底版)
每次取最低字节,拼到结果后面,两个数一起移位,重复 4 次:
拿
方法 B:掩码移位(优化版)
4 个字节各自一步到位,直接移到镜像位置:最低字节去最高位,次低字节去次高位,反过来也一样。
这是应该瞄准的版本,但前提是位操作已经练成本能,不然现场压力下很容易写错。
易错点
最近面了 Meta,分享一下 coding 轮的题目。这是热身题。
题目
实现
uint32_t byte_swap(uint32_t word),把一个 32 位整数的字节顺序翻转:byte_swap(0x11223344) == 0x44332211byte_swap(0x12345678) == 0x78563412byte_swap(0x01020304) == 0x04030201
题目本身不难,真正考的是位操作熟不熟。掩码和移位用得顺手的话,这就是一行代码的事;不顺手,就得有个 plan B,一个字节一个字节地拼,而不是同时摆弄四个掩码。
方法 A:逐字节循环(保底版)
每次取最低字节,拼到结果后面,两个数一起移位,重复 4 次:
uint32_t byte_swap(uint32_t word) {
uint32_t result = 0;
for (int i = 0; i < 4; i++) {
result = (result << 8) | (word & 0xFFu);
word >>= 8;
}
return result;
}
uint32_t result = 0;
for (int i = 0; i < 4; i++) {
result = (result << 8) | (word & 0xFFu);
word >>= 8;
}
return result;
}
拿
0x11223344 走一遍:结果依次是 0x44、0x4433、0x443322、0x44332211。答案一样,只是思路是"一次处理一个字节",不需要任何位操作灵感。方法 B:掩码移位(优化版)
4 个字节各自一步到位,直接移到镜像位置:最低字节去最高位,次低字节去次高位,反过来也一样。
uint32_t byte_swap(uint32_t word) {
return ((word & 0x000000FFu) << 24)
| ((word & 0x0000FF00u) << 8)
| ((word & 0x00FF0000u) >> 8)
| ((word & 0xFF000000u) >> 24);
}
return ((word & 0x000000FFu) << 24)
| ((word & 0x0000FF00u) << 8)
| ((word & 0x00FF0000u) >> 8)
| ((word & 0xFF000000u) >> 24);
}
这是应该瞄准的版本,但前提是位操作已经练成本能,不然现场压力下很容易写错。
易错点
- 先掩码再移位,顺序反了比特会串到相邻字节里。
- 字面量加
u后缀:0xFF000000在有符号 32 位里是负数,对有符号负数右移是实现定义行为,别踩。 - 常见追问是 64 位版本:同样的掩码思路扩展,或者直接用 builtin(
__builtin_bswap32/__builtin_bswap64)。
共1条回复
✨ 您正在体验新版论坛UI

