20190903:(leetcode习题)颠倒二进制位

颠倒二进制位

题目

在这里插入图片描述

大致思路

  1. 思路一:将该数与1,10,100… 等32个数做异或运算,判断对应二进制数每一位的数字是0还是1,然后将其存入数组res,最后乘以对应的幂次,即可得到转换后的值。
  2. 思路二:将上述思路一步到位,直接计算到res的对应位置上。

代码实现

package com.immunize.leetcode.reverseBits;

public class reverseBits {

	// 直接计算其反转后的二进制数,注意幂次不要乘错
	public static int reverseBits(int n) {
		int count = 0;
		for (int i = 31; i >= 0; i--) {
			count = (n >>> i & 1) << (31 - i) | count;
		}
		return count;
	}

	// 常规思路:将这32位数,分别与1异或运算,如果不为0,则res中对应32-i位数字为1,依次推算出最终的res数组,最后乘以2的i次幂即可。
	public static int reverseBits2(int n) {
		int[] re = new int[32];
		int flag = 1;
		int index = 31;
		// 如果用int可能存在溢出问题
		long result = 0;
		while (flag != 0) {
			if ((flag & n) != 0) {
				re[index] = 1;
			}
			flag = flag << 1;
			index--;
		}
		for (int i = 31; i >= 0; i--) {
			result += re[i] * Math.pow(2, i);
		}
		return (int) result;
	}

	public static void main(String[] args) {
		System.out.println(reverseBits(43261596));
		System.out.println(reverseBits2(43261596));
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值