Показать сообщение отдельно
  #6 (permalink)  
Старый 24.11.2015, 00:40
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Rise Посмотреть сообщение
Malleys, почему тогда '-1011' куда делись 245 и 11110101 ?
Никуда. Двоичное 11110101 это десятичное 245, но если воспринимать его как 8 битовое число, то оно означает десятичное -11.
Если -11 перевести в двоичную систему, получим -1011.

Сообщение от Rise Посмотреть сообщение
Для представления отрицательного двоичного числа нашел такое:
alert( (-11 >>> 0).toString(2) );
alert( parseInt('11111111111111111111111111110101', 2) >> 0 );
Предложенный Вами способ приводит к неоднозначности:
alert((-11 >>> 0).toString(2)          == '11111111111111111111111111110101');
alert((-4294967307 >>> 0).toString(2)  == '11111111111111111111111111110101'); // Перевод разных чисел соответствует одному и тому же числу...


Зачем вы используете для перевода чисел в двоичную систему побитовый сдвиг вправо, если он при этом конвертирует числа в 32-х битовые???
По сути вы находите остаток от деления на 2^32.

alert((-30064771072 >>> 0).toString(2)); // переводит неверно
alert((-30064771072).toString(2)); // переводит верно


1.25 = 1 * 2^0 + 0 * 2^(-1) + 1 * 2^(-2) = двоичное 1.01
alert((1.25 >>> 0).toString(2)); // переводит неверно
alert((1.25).toString(2)); // переводит верно


Почему ~10..toString(2) дает -1011?
Потому что -11 представлено в виде суммы степеней двойки и выписаны коэффициенты.
Почему ~10 даёт -11, а не двоичное 11111111111111111111111111110101?
Потому что операнды всех битовых операций конвертируются в 32-х битовые целые со знаком представленные в дополнительном бите.
Таким образом однозначно могут быть представлены целые числа от 0 до 2147483647 и от -2147483648 до -1, с оговоркой, что они 32-х битовые.
Ответить с цитированием