Здравствуйте !
Интересует работа оператора
~
в js, в интернете многие ограничиваются примером типа . . .
9 === 00000000000000000000000000001001
~9 === 11111111111111111111111111110110
Из теории есть то, что оператор
~
инвертирует каждый бит в 32ти двух битном представлении числа, я решил заморочиться и написать функцию, которая сначала представляет число в двоичной системе счисления и 32ти двух битном представлении, а потом его инвертирует, но не пойму одного . . .
let digit = 9;
function addNullToStart(dig){ // берем число (аргумент) преобразовываем в двоичную, затем добавляем нули вачале (если конечно нужны)
let conDig = (dig).toString(2),
conDigLen = conDig.length,
howMuchTo32 = 32 - conDigLen,
zeroStr = '',
res = '';
if( conDigLen < 32 ){
for(let k=0; k<howMuchTo32; k++){
zeroStr += '0';
};
res = zeroStr + conDig;
}
return res;
};
function reverseBites(dig){ (в числе переданном аргументом меняем 1 на 0 и 0 соответственно на 1, вроде так работает ~ )
let res = '';
for(let k=0; k<dig.length; k++){
if( !Number(dig[k]) ){
res += '1'
}else{
res += '0';
};
};
return res;
};
let convertedTo32Bits = addNullToStart( digit );
let reversedBites32Bits = reverseBites( convertedTo32Bits );
console.log(
convertedTo32Bits , // 00000000000000000000000000001001 это 9 ( т.е наше число )
reversedBites32Bits // 11111111111111111111111111110110 это 4294967286 ( т.е. инверсия двоичного представления девятки )
);
Помогите разобраться, где я сошёл с правильного пути, чтобы мне не запоминать тупо , что 9 это будет с тильдой -10 ( -(n+1) ) и бла бла бла, я же всё сделал вроде как по теории, инвертировал, НО вот как получается именно отрицательное число, никто почему-то не объясняет, хотя у всех вот это гигантское инвертированное число почему-то получается отрицательным, заранее спасибо за ответ!