查看: 48| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] [面经] Meta Coding:32 位整数按字节翻转(热身题)

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

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

上一篇:[Solution] 200. 岛屿数量三解全讲:DFS / BFS / 并查集 + 变式预警(Google 高频)
下一篇:[面经] Meta Coding:没有地图的迷宫找奶酪(DFS + 回溯)
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表