File tree Expand file tree Collapse file tree 2 files changed +26
-4
lines changed Top Open diff view settings Expand file tree Collapse file tree 2 files changed +26
-4
lines changed Top Open diff view settings Original file line number Diff line number Diff line change 77 * @param number
88 */
99function nextNumber ( number ) {
10+ // min - swap zeros and 1 until all ones are in the right side
11+ let min = swapper ( number ) ;
1012
13+ // max - swap 0's and 1's until all ones are on the left side
14+ let max = swapper ( number , false ) ;
15+
16+ return [ min , max ] ;
17+ }
18+
19+ function swapper ( number , toRight = true ) {
20+ const result = [ ] ;
21+ const action = toRight ? { one : 'push' , zero : 'unshift' } : { one : 'unshift' , zero : 'push' } ;
22+
23+ while ( number > 0 ) {
24+ if ( number & 1 ) {
25+ result [ action . one ] ( 1 ) ;
26+ } else {
27+ result [ action . zero ] ( 0 ) ;
28+ }
29+ number >>= 1 ;
30+ }
31+
32+ return parseInt ( result . join ( '' ) , 2 ) ;
1133}
1234
1335module . exports = nextNumber ;
Original file line number Diff line number Diff line change 11const expect = require ( 'chai' ) . expect ;
2- const nextNumber = require ( './03-flip-bit-to-win ' ) ;
2+ const nextNumber = require ( './04-next-number ' ) ;
33
44describe ( 'Bit Manipulation: nextNumber' , function ( ) {
55 it ( 'one zero' , function ( ) {
6- expect ( nextNumber ( 0b101 ) ) . to . equal ( [ 11 , 110 ] ) ;
6+ expect ( nextNumber ( 0b101 ) ) . to . eql ( [ 0b11 , 0b110 ] ) ;
77 } ) ;
88
99 it ( 'all ones' , function ( ) {
10- expect ( nextNumber ( 0b111 ) ) . to . equal ( [ 111 , 111 ] ) ;
10+ expect ( nextNumber ( 0b111 ) ) . to . eql ( [ 0b111 , 0b111 ] ) ;
1111 } ) ;
1212
1313 it ( 'largest number already' , function ( ) {
14- expect ( nextNumber ( 0b100 ) ) . to . equal ( [ 1 , 100 ] ) ;
14+ expect ( nextNumber ( 0b100 ) ) . to . eql ( [ 0b1 , 0b100 ] ) ;
1515 } ) ;
1616} ) ;
You can’t perform that action at this time.
0 commit comments