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.