190.[LeetCode]Reverse Bits(*)

来源:互联网 发布:冒险岛实时市场数据 编辑:程序博客网 时间:2024/05/18 06:13

本题是非常典型的位运算题,倒置一个32位的无符号int数。

循环最小的方法是将前16位和后16位互换,一个循环16次

关于位操作的一些tips

  1. 位操作只能用于整型数据,对float和double的类型位操作会报错
  2. 位操作的优先级比较低,要使用括号
  3. 与或不用说,异或是 ^ ,而非是 ~。
  4. 左移 低位补0,右移 对于无符号数来说,高位补零。有符号数,各个编译器处理方法不一样
public class Solution {    // you need treat n as an unsigned value    public int reverseBits(int n) {        int i = 0;        int j = 31;        while(i < 16){            n = swapBits(n,i++,j--);        }        return n;    }    /**     * 这个方法用于交换两个bit位的值     */    public int swapBits(int n,int i,int j){        // 首先要获取对应的两个位置是0还是1,方法:右移对应位置 到 第一个位置,然后把和1做与运算        int pos_i = (n >> i) & 1; //  低位        int pos_j = (n >> j) & 1; //  高位        // 如果相等,则不交换,否则交换,求1个位置的逆,可以在对应位置做异或操作,0^1 = 1,1^1 = 0        if(pos_i != pos_j){            return n = n^((1<<i)|(1<<j));        }        return n;    }}
0 0
原创粉丝点击