Teraz sprawiamy, aby nasza funkcja increment działała z liczbami nieparzystymi. Nadal korzystamy z operatorów porównania, nie jest to bitwise pełną gębą, ale już całkiem niezły progress robimy.

Ok, zacznę od funkcji a potem wytłumaczę:

function bitwiseIncrement_v2(num){
    if((num & 1) ^ 1)
        return num | 1;
    else {
        let pos = 0;
        let mask = 1;
        let _new = num ^ mask;
        while(_new <= num){
            console.log(_new);
            mask = mask << 1;
            _new = _new ^ mask;
            
            
        }
        return _new;
    }
        
}

let sevenplusplus = bitwiseIncrement_v2(7);

// 6
// 4
// 0

console.log(sevenplusplus); //8

Czyli co się tu dzieje? Zobaczmy na 7:

        ( 8 ) ( 4 ) ( 2 ) ( 1 )
          0     1     1     1

7 ^ 1:    0     1     1     1
          0     0     0     1
         ---------------------
          0     1     1     0
6

6 ^ 2:    0     1     1     0
          0     0     1     0
          -------------------
          0     1     0     0
4

4 ^ 4:    0     1     0     0
          0     1     0     0
          -------------------
          0     0     0     0
0

0 ^ 8:    0     0     0     0
          1     0     0     0
          -------------------
          1     0     0     0  

Dokładnie z tym mamy do czynienia. Posprzątajmy:

function bitwiseIncrement_v2(num){
    if((num & 1) ^ 1)
        return num | 1;
    else {

        let mask = 1;
        let _new = num ^ mask;
        while(_new <= num){
            mask = mask << 1;
            _new = _new ^ mask;
        }
        return _new;
    }
        
}

for (var i =0; i < 20; i++){
    console.log(i, bitwiseIncrement_v2(i));
}
    
// 0 1
// 1 2
// 2 3
// 3 4
// 4 5
// 5 6
// 6 7
// 7 8
// 8 9
// 9 10
// 10 11
// 11 12
// 12 13
// 13 14
// 14 15
// 15 16
// 16 17
// 17 18
// 18 19
// 19 20

Ok, jesteśmy na dobrym tropie. To jest, funkcja działa, ale można zapewne poprawić to i owo.