参考代码:
public class Solution { public int reverseBits(int n) { int ret = 0; int count = 32; while (count-- > 0) { int lastBit = n & 1; ret = ret << 1 | lastBit; n = n >> 1; } return ret; }}
题目的意思是要将整个二进制数进行一个翻转,100->001,10111->11101。
需要用到位运算:
与&:有一个不是1,结果都是,0,0&0=0 0&1=0 1&0=0 1&1=1;
或|:有一个是1,结果都是1,0|0=0 0|1=1 1|0=1 1|1=1;
异或^:两个位只要不一样就是1,否则为0,0^0=0 0^1=1 1^0=1 1^1=0;
取反~:原来是1变为0,0变为1,~1=0 ~0=1;
左移<<:左边的二进制位丢弃,右边补0
右移>>:正数左补0,负数左补1,右边丢弃
无符号左移<<<:左边的二进制位丢弃,右边补0
无符号右移>>>:忽略符号位,空位都以0补齐
int lastBit = n & 1; 获取n最后一位;
ret = ret << 1 | lastBit; 将结果左移一位再添加n的最后一位
n = n >> 1; n右移减少一位
循环再次获取n的最后一位,再加到ret的结尾
不断重复,直至完全颠倒。