71. Reverse Bits

Reverse bits of a given 32 bits unsigned integer.

For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as00111001011110000010100101000000).

Follow up:
If this function is called many times, how would you optimize it?

Related problem: Reverse Integer

分析:每次n都是依次做除以2的操作,result左移相当于乘以2的操作(当前最后一位补0),遇到n的最后一位是1的情况,则answer目前的值最后一位从0变成1.整个循环的次数是机器内无符号数的长度。

 public int reverseBits(int n) {
		 int answer = 0;
	     int i;
	     /*把一个unsigned int 数字1一直左移,直到它变成全0的时候,也就得到了该机器内unsigned int的长度*/
	     for (i = 1; i != 0; i <<= 1){//每次循环结束,保证answer最后一位刚好是n要舍去的那一位
	         answer <<= 1;/*answer左移一位,相当于乘以2的操作*/
	        // System.out.println("answer = "+answer);
	         if ((n&1)==1) { /*n的最后一位是1*/
	        	 answer ^= 1; /*把answer当前的最后以为也变成1*/
	        	}
	         n >>= 1;/*n向右移,每次相当于除以2的操作*/
	     }
	     return answer;
	    }
	 
	 public int reverseBits2(int n) {
		 int answer = 0;
	     int i;
	     /*把一个unsigned int 数字1一直左移,直到它变成全0的时候,也就得到了该机器内unsigned int的长度*/
	     for (i = 1; i != 0; i <<= 1){//每次循环结束,保证answer最后一位刚好是n要舍去的那一位
	         answer <<= 1;/*answer左移一位,相当于乘以2的操作,所以目前最后一位肯定是0*/
	        // System.out.println("answer = "+answer);
	         if ((n&1)==1) { /*n的最后一位是1*/
	        	 answer =answer + 1; /*把answer当前的最后以为也变成1*/
	        	}
	         n >>= 1;/*n向右移,每次相当于除以2的操作*/
	     }
	     return answer;
	    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值