颠倒给定的 32 位无符号整数的二进制位。
提示:
- 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
- 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数
-3
,输出表示有符号整数-1073741825
。
进阶:
如果多次调用这个函数,你将如何优化你的算法?
示例 1:
输入: 00000010100101000001111010011100 输出: 00111001011110000010100101000000 解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:
输入:11111111111111111111111111111101 输出:10111111111111111111111111111111 解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293, 因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
示例 1:
输入:n = 00000010100101000001111010011100 输出:964176192 (00111001011110000010100101000000) 解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:
输入:n = 11111111111111111111111111111101 输出:3221225471 (10111111111111111111111111111111) 解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293, 因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
提示:
- 输入是一个长度为
32
的二进制字符串
Related Topics
题解
头皮发麻。需要重新复习下二进制运算的相关知识
与&:0&0=0 0&1=0 1&0=0 1&1=1
或|:0|0=0 0|1=1 1|0=1 1|1=1
异或^:0^0=0 0^1=1 1^0=1 1^1=0
取反~:~1=0 ~0=1
左移<<:左边的二进制位丢弃,右边补0
右移>>:正数左补0,负数左补1,右边丢弃
无符号左移<<<:左边的二进制位丢弃,右边补0
无符号右移>>>:忽略符号位,空位都以0补齐
按照题意,我们需要把原本32位二进制数的第0位移动到第31位,第1位移动到第30位,第2位移动到第29位,依次处理
public int reverseBits(int n) {
int rev = 0;
for (int i = 0; i < 32; i++) {
//tmp = n 与上 1
//实际操作为
// 00000000000000000000001010101110
// 与上
// 00000000000000000000000000000001
// 的操作
//结果为 n的最末尾数, 因为与后面的数字 前面都为0,最末尾为1,
//根据与运算的规则 结果为
// 00000000000000000000000000000001
// 或者
// 00000000000000000000000000000000
int tmp = n&1;
//把上面的结果tmp左移到左边对应的(31-i)位置
//结果为
// 10000000000000000000000000000000
// 或者
// 00000000000000000000000000000000
tmp = tmp << (31-i);
//初始的rev为
// 00000000000000000000000000000000
// 和tmp进行或运算 ,就可以将原来的末位二进制数移动到rev顺序的对应位置
rev = rev|tmp;
// 再把n往右无符号右移一位,去除掉了刚刚运算过的末位数
n = n>>>1;
}
return rev;
}
emm还有一个,可以看下java.lang.Integer#reverse的方法
/**
* Returns the value obtained by reversing the order of the bits in the
* two's complement binary representation of the specified {@code int}
* value.
*
* @param i the value to be reversed
* @return the value obtained by reversing order of the bits in the
* specified {@code int} value.
* @since 1.5
*/
public static int reverse(int i) {
// HD, Figure 7-1
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
i = (i << 24) | ((i & 0xff00) << 8) |
((i >>> 8) & 0xff00) | (i >>> 24);
return i;
}
发表评论