package com.interview.books.ccinterview; /** * Created_By: stefanie * Date: 14-12-13 * Time: 下午4:25 */ public class CC14_NumbersWithSameNumberOfOne { public static int next(int next){ int number = next; int endZeroCount = 0; int midOneCount = 0; while((number & 1) == 0 && (number != 0)){ //count end zero endZeroCount++; number >>= 1; } while((number & 1) == 1){ //count middle one midOneCount++; number >>= 1; } //if n == 0 or can't find a larger number if(endZeroCount + midOneCount == 0 || endZeroCount + midOneCount == 31) return -1; int total = endZeroCount + midOneCount; next |= 1 << total; //00000100000 rightmost zero to one next &= ~((1 << total) - 1); //11111100000 clear left of rightmost to zero next |= (1 << (midOneCount - 1)) - 1;//00000000011 put rest 1 to the end return next; // return n + (1 << c0) + (1 << (c1 - 1)) - 1; } public static int prev(int prev){ int number = prev; int midZeroCount = 0; int endOneCount = 0; while((number & 1) == 1){ endOneCount++; number >>= 1; } if(number == 0) return -1; while((number & 1) == 0 && (number != 0)){ midZeroCount++; number >>= 1; } int totol = midZeroCount + endOneCount; prev &= ((~0) << (totol + 1)); //clear from bit p onwards int mask = (1 << (endOneCount + 1)) - 1;//sequence of (c1 + 1) ones prev |= mask << (midZeroCount - 1); return prev; // return n - (1 << c1) - (1 << (c0 - 1)) + 1; } public static void main(String[] args){ int n = 0x367C; //0011011001111100 System.out.println(Integer.toBinaryString(n)); n = next(n); System.out.println(Integer.toBinaryString(n)); System.out.println(Integer.toBinaryString(prev(n))); } }