整数的二进制形式数反转
2015-03-25 16:05
211 查看
前些天在网上做题,看到了这么一道题:给定一个无符号32位整数,要求将其2进制形式数反转(即首尾颠倒,非按位取反),输出反转后的整数。(即如果给定的数为:43261596,它的二进制数为:00000010100101000001111010011100,将二进制数反转得到:00111001011110000010100101000000,所以期望的输出结果应该为:964176192)
当时自己的第一反应居然是:
1、先用Integer.toBinaryString(num),将整数转成二进制字符串。
2、把生成的二进制字符串放到list里面,然后进行反转。
3、用list.toString()把反转结果转成String字符串。
4、再用Integer.parseInt(str,2)把二进制字符串转回整数。
简直蠢哭_(:з」∠)_
后来在同事的提醒下才想到一个平时几乎很少用的东东:位运算。
用到位运算接下
public int reverseBits(int n) {
int y = 0; //0000 0000 0000 0000 0000 0000
int digit = 0;
for(int i = 0 ; i < 32; i++){
y = y << 1; //将y左移
y = y | n & 1; //将n与1做与运算,目的是为了将n的最后一位复制下来,再去跟y做或运算,即把复制下来的值放到y上面
x = n >> 1; //将n右移
}
return y;
}
第一次循环拿到n的最后一位,把它复制到y的最后一位上面。然后y左移,n右移。
第二次循环拿到n的倒数第二位,把它复制到y的最后一位上面。然后y左移,n右移。
循环结束后,二进制数得到反转。
当时自己的第一反应居然是:
1、先用Integer.toBinaryString(num),将整数转成二进制字符串。
2、把生成的二进制字符串放到list里面,然后进行反转。
3、用list.toString()把反转结果转成String字符串。
4、再用Integer.parseInt(str,2)把二进制字符串转回整数。
简直蠢哭_(:з」∠)_
后来在同事的提醒下才想到一个平时几乎很少用的东东:位运算。
用到位运算接下
去就简单多了
public int reverseBits(int n) {
int y = 0; //0000 0000 0000 0000 0000 0000
int digit = 0;
for(int i = 0 ; i < 32; i++){
y = y << 1; //将y左移
y = y | n & 1; //将n与1做与运算,目的是为了将n的最后一位复制下来,再去跟y做或运算,即把复制下来的值放到y上面
x = n >> 1; //将n右移
}
return y;
}
第一次循环拿到n的最后一位,把它复制到y的最后一位上面。然后y左移,n右移。
第二次循环拿到n的倒数第二位,把它复制到y的最后一位上面。然后y左移,n右移。
循环结束后,二进制数得到反转。
相关文章推荐
- C语言中以二进制形式输出整数
- 计算一个32位整数的二进制形式中1的个数
- 求整数n的二进制形式
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法
- 第十二周 项目三:用递归方法求某个整数地二进制形式
- 获取内存中整数二进制形式
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法(ZZ)
- 将任一整数转换为二进制形式
- 用递归实现求一个整数的二进制形式
- 使用位段实现整数的二进制形式输出
- c语言打印一个整数的二进制形式
- 求一个整数的二进制形式会有多少个1
- 判断一无符号整数的二进制形式中是否包含偶数个1
- 求整数的二进制形式中包含1的个数
- LintCode算法题解——奇偶分割数组、二进制中1个数、反转整数、加一、排序数组转换为高度最小的二叉搜索树、二进制求和
- 输出整数n的二进制形式
- (转贴)反转一个字节 和 判断32位整数二进制中1的个数 的算法
- 汇编语言: 编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来。
- 判断一无符号整数的二进制形式中是否包含偶数个1
- 编程之美--反转整数二进制位