190 Reverse Bits
2016-02-03 20:39
357 查看
题目链接:https://leetcode.com/problems/reverse-bits/
题目:
解题思路:
这题的考点是比特操作。
这题的本质是,找到一个 bit 串,使其与原 bit 串异或后能得到逆转后的比特串。
思路是:
1. 分别从 bit 串的头和尾同时向中间扫描。扫描中对应的两个比特为需要对调的 bit。
2. 扫描过程中的左右两个比特若不等,说明这两个 bit 需要变为对方的 bit 表示,即,0 变为 1,1 变为 0。则将这两个位置上的 bit与 1 异或。
3. 若扫描的两个比特相同,说明这两个 bit 的内容无需变更,则用原比特串对应两个位置上的 bit 与 0 异或。
注意:将 1 左移 32 位后,所得数已大于整型所能表示的范围,不可再将值赋给 int。将 long 型强制截断为 32 位,编译器会报错。
代码实现过程中没有一次性将辅助 bit 串全部求出再与原 bit 串异或,而是每得出一位就异或一位。
代码实现:
贴一个错误的方法,暂时不知道错的原因,这种方法将辅助 bit 串求出再与原 bit 串异或。
题目:
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000). Follow up: If this function is called many times, how would you optimize it?
解题思路:
这题的考点是比特操作。
这题的本质是,找到一个 bit 串,使其与原 bit 串异或后能得到逆转后的比特串。
思路是:
1. 分别从 bit 串的头和尾同时向中间扫描。扫描中对应的两个比特为需要对调的 bit。
2. 扫描过程中的左右两个比特若不等,说明这两个 bit 需要变为对方的 bit 表示,即,0 变为 1,1 变为 0。则将这两个位置上的 bit与 1 异或。
3. 若扫描的两个比特相同,说明这两个 bit 的内容无需变更,则用原比特串对应两个位置上的 bit 与 0 异或。
注意:将 1 左移 32 位后,所得数已大于整型所能表示的范围,不可再将值赋给 int。将 long 型强制截断为 32 位,编译器会报错。
代码实现过程中没有一次性将辅助 bit 串全部求出再与原 bit 串异或,而是每得出一位就异或一位。
代码实现:
public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { for (int i = 0; i < 16; i++) { n = swapBits(n, i, 32 - i - 1); } return n; } public int swapBits(int n, int i, int j) { int a = (n >> i) & 1; int b = (n >> j) & 1; if ((a ^ b) != 0) { return n ^= (1 << i) | (1 << j); } return n; } }
600 / 600 test cases passed. Status: Accepted Runtime: 3 ms
贴一个错误的方法,暂时不知道错的原因,这种方法将辅助 bit 串求出再与原 bit 串异或。
public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { int left = 0; int right = 0; int k = 1 << 31; for(int i = 0; i < 16; i ++) { int l = n << i & k; int r = n >>> i & 0x1; if(l != r) { left = (left << 1) ^ 0x1; right = right ^ (1 << i); } else { left = left << 1; } } return (left << 16) ^ right ^ n; } }
相关文章推荐
- Docker常用命令
- TypeError: 'append' called on an object that does not implement interface FormData
- bzoj3930 选数 递推
- C++内存管理(超长)
- Introduction
- 网页设计中文本输入框的一些参数说明 【精华】
- Linux sfdisk 命令
- 数据库 表
- Flash, Flex, Air, Flashplayer之间的相互关系是什么?
- C++test 关于resource参数和include/exclude参数说明
- 单链表逆转
- IOS开发:performSelector: withObject:afterDelay 的Object里传入多个参数
- 常用快捷键及shell基本命令
- #Memcached系列#(1)初识Memcached
- python-----读写操作
- 最小公倍数 LCM 1
- CentOS6.5与window远程桌面配置
- ADG打补丁
- Cocos移植到Android-通过命令行交叉编译打包
- 图片缓存