Next Number java 走地牙CTCI 5.4

/*
Next Number: Given a positive integer, print the next smallest and the last largest
number that have the same number of 1 bits in their binary representation.
方法是:1:最小下一个:11011001111100 相同数量的1的情况下 一定是从后往前数第一个0 变成1 再把后面的全变成0,最后从最后以为开始把缺的1的数量补齐
                    11011010000000
                          p
                    11011010001111
                    要完成这个步骤 首先要建立一个mask 用于过滤掉位置之后的字符 第一步全变0 之后再把1填进去
*/
public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");
        int bit = 13948;
        System.out.println(Integer.toBinaryString(bit));
        int next = findNext(bit);
        System.out.println(Integer.toBinaryString(next));
        int last = findLast(bit);
        System.out.println(Integer.toBinaryString(last));
    }
    //先找到位置p 找p的方法是从右往左一次位移 如果是0 则 numOfZero+1;是1则numOfOne+1;一直到1前面第一个0的位置 而p则是0的个数加上1的个数;
    public static int findNext(int bit) {
        int temp = bit;
        int numOfZero = 0, numOfOne = 0;
        while(temp != 0 && (temp & 1) == 0) {
            numOfZero++;
            temp = temp >> 1;
        }
        while(temp != 0 && (temp & 1) == 1) {
            numOfOne++;
            temp >>= 1;
        }
        int p = numOfOne + numOfZero;
        int mask = ~((1 << p) - 1);
        bit |= (1 << p);
        bit &= mask;
        bit |= ((1 << (numOfOne - 1)) - 1);
        return bit;
    }
    //找上一个最大的时候,反过来思考就行 找到0前面的第一个1,p的位置就是这里,同样找到0的个数和1的个数,把配置的1变成0之后 再把后面的位置清0
    //最后填1 1是从配位置开始往后填写;
    public static int findLast(int bit) {
        int temp = bit;
        int numOfZero = 0, numOfOne = 0;
        while(temp != 0 && (temp & 1) == 1) {
            numOfOne++;
            temp >>= 1;
        }
        while(temp != 0 && (temp & 1) == 0) {
            numOfZero++;
            temp >>= 1;
        }
        int p = numOfOne + numOfZero;
        int mask = ~((1 << (p + 1)) - 1);
        bit &= mask;
        bit |= ((1 << p) - 1);
        bit &= ~((1 << (numOfZero - 1)) - 1);
        return bit;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值