[LeetCode190. 颠倒二进制位] | 刷题打卡

349 阅读3分钟

题目描述

颠倒给定的 32 位无符号整数的二进制位。

 

示例 1:

输入: 00000010100101000001111010011100 输出: 00111001011110000010100101000000 解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。 示例 2:

输入:11111111111111111111111111111101 输出:10111111111111111111111111111111 解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,   因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。  

提示:

请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。

来源:力扣(LeetCode) 链接: 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

通过 位域 + 共用体,进行快速转换

AC 代码

typedef union {
    struct {
        unsigned int b00 : 1, b01 : 1, b02 : 1, b03 : 1, b04 : 1, b05 : 1, b06 : 1, b07 : 1, b08 : 1, b09 : 1,
                b10 : 1, b11 : 1, b12 : 1, b13 : 1, b14 : 1, b15 : 1, b16 : 1, b17 : 1, b18 : 1, b19 : 1,
                b20 : 1, b21 : 1, b22 : 1, b23 : 1, b24 : 1, b25 : 1, b26 : 1, b27 : 1, b28 : 1, b29 : 1,
                b30 : 1, b31 : 1;
    };
    int val;
} Int;

void cov(Int *i, Int *j) {
    i->b00 = j->b31;
    i->b01 = j->b30;
    i->b02 = j->b29;
    i->b03 = j->b28;
    i->b04 = j->b27;
    i->b05 = j->b26;
    i->b06 = j->b25;
    i->b07 = j->b24;
    i->b08 = j->b23;
    i->b09 = j->b22;
    i->b10 = j->b21;
    i->b11 = j->b20;
    i->b12 = j->b19;
    i->b13 = j->b18;
    i->b14 = j->b17;
    i->b15 = j->b16;
    i->b16 = j->b15;
    i->b17 = j->b14;
    i->b18 = j->b13;
    i->b19 = j->b12;
    i->b20 = j->b11;
    i->b21 = j->b10;
    i->b22 = j->b09;
    i->b23 = j->b08;
    i->b24 = j->b07;
    i->b25 = j->b06;
    i->b26 = j->b05;
    i->b27 = j->b04;
    i->b28 = j->b03;
    i->b29 = j->b02;
    i->b30 = j->b01;
    i->b31 = j->b00;
}

uint32_t reverseBits(uint32_t n) {
    Int *i = (Int *)&n;
    Int j;
    cov(&j, i);
    return j.val;
}

总结

位域 + 共用体 的应用

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情