【问题标题】:Get mosts significant nibble, regardless of int bit length and endianness获取最重要的半字节,无论 int 位长度和字节序如何
【发布时间】:2014-05-18 09:38:42
【问题描述】:

我的头开始疼了……我看这个方法太久了。

我试图掩盖 int 的最重要半字节,而不管 int 位长度和机器的字节序。假设x = 8425 = 0010 0000 1110 1001 = 0x20E9。我知道要获得最不重要的半字节,9,我只需要执行x & 0xF 之类的操作即可返回9。但是最重​​要的半字节2 怎么样?

如果我从现在开始的逻辑崩溃了,我很抱歉,我的大脑完全被烧毁了,但我走了:

我的书告诉我,数据类型 int 的位长 w 可以用w = sizeof(int)<<3 计算。如果我知道这台机器是大端的,我可以使用0xF << w-41111 用于最重要的半字节,将0000 用于其余部分,即1111 0000 0000 0000。如果我知道这台机器是 little-endian,我可以通过 0xF >> w-8 得到 0000 0000 0000 1111。幸运的是,即使我们被告知假设右移是在算术上完成的,这仍然有效,因为0xF 总是给我0000 的第一位。但这不是一个适当的解决方案。我们不允许测试字节顺序然后从那里继续,那我该怎么办?

【问题讨论】:

  • "我的书告诉我,数据类型 int 的位长 w 可以用 w = sizeof(int)
  • 您的问题不够具体。如果您使用的是 16 位 int 的系统,0x20E9 的最重要半字节仅是 2。否则它将是0。另外,您认为负整数的最重要半字节是什么?请澄清。

标签: c bit-manipulation endianness


【解决方案1】:

位移运算符在字节序之上的抽象级别上运行。 “左”移总是移向最高有效位,“右”移总是移向最低有效位。

【讨论】:

  • 哇哦。也许他们应该称它们为大转变和小转变,以便从我的生活中节省几年:(
【解决方案2】:

无论字节顺序如何,您都应该能够右移(number of bits) - 4。 由于您已经知道如何计算位数,因此只需减去 4 并移动该数字就足够了,然后(为了安全起见)使用 0xF 进行掩码。

有关字节序的讨论,请参阅this question

【讨论】:

    【解决方案3】:

    Q但是最重要的半字节 2 怎么样?

    A (x >> (sizeof(int)*8-4)) & 0xF

    【讨论】:

    • 此解决方案仅适用于8-bit 整数,因为要移位的位数取决于整数的位长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多