题目描述
颠倒给定的 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 春招闯关活动」, 点击查看 活动详情