在计算机中,除了十进制是有符号的外,其他如二进制、八进制、16进制都是无符号的。
计算机里的数是用二进制表示的,
最左边的这一位一般用来表示这个数是正数还是负数,这样的话这个数就是有符号整数。
如果最左边这一位不用来表示正负,而是和后面的连在一起表示整数,那么就不能区分这个数是正还是负,就只能是正数,这就是无符号整数。
【1】原码、反码、补码、移码
loading
【2】十进制 <==> 二进制
//十进制整数转二进制,除2取余数
function int_decimal2binary(num, isAbs = false) {
if(!num)return '';
if (num < 0) {
num = Math.abs(num);
isAbs = true;
}
let rst = '';
while (num) {
rst += num % 2 === 0 ? '0' : '1';
num >>= 1;
}
return rst.split('').reverse().join('') * (isAbs ? -1 : 1);
}
console.log(int_decimal2binary(175), (175).toString(2));//10101111
console.log(int_decimal2binary(-175), (-175).toString(2));//-10101111
//十进制小数转二进制,除2取余数
function float_decimal2binary(num, isAbs = false) {
if(!num)return '';
(num + '').indexOf('0.') === -1 && (num = '0.' + num); //num补0
if (num < 0) {
num = Math.abs(num);
isAbs = true;
}
let rst = '';
do {
num *= 2;
rst += num >= 1 ? (num -= 1, '1') : '0';
} while (num !== 0);
return ('0.' + rst) * (isAbs ? -1 : 1);
}
console.log(float_decimal2binary(0.71875), (0.71875).toString(2));//0.10111
console.log(float_decimal2binary(-0.71875), (-0.71875).toString(2));//-0.10111
//组合起来
function decimal2binary(num, isAbs = false) {
if (num < 0) {
num = Math.abs(num);
isAbs = true;
}
const [int, float] = (num + '').split('.');
return (int_decimal2binary(int) + float_decimal2binary(float)) * (isAbs ? -1 : 1);
}
console.log(decimal2binary(175.71875), (175.71875).toString(2));//10101111.10111
console.log(decimal2binary(-175.71875), (-175.71875).toString(2));//-10101111.10111
最终代码
const decimal2binary = function () {
//十进制整数转二进制,除2取余数
function int_decimal2binary(num) {
if (!num) return '';
let rst = '';
while (num) {
rst += num % 2 === 0 ? '0' : '1';
num >>= 1;
}
return rst.split('').reverse().join('');
}
//十进制小数转二进制,除2取余数
function float_decimal2binary(num) {
if (!num) return '';
(num + '').indexOf('0.') === -1 && (num = '0.' + num); //num补0
let rst = '';
do {
num *= 2;
rst += num >= 1 ? (num -= 1, '1') : '0';
} while (num !== 0);
return +('0.' + rst);
}
return function (num, isAbs = false) {
if (num < 0) {
num = Math.abs(num);
isAbs = true;
}
const [int, float] = (num + '').split('.');
return (int_decimal2binary(int) + float_decimal2binary(float)) * (isAbs ? -1 : 1);
}
}();
console.log(decimal2binary(175), (175).toString(2));//10101111
console.log(decimal2binary(-175), (-175).toString(2));//-10101111
console.log(decimal2binary(0.71875), (0.71875).toString(2));//0.10111
console.log(decimal2binary(-0.71875), (-0.71875).toString(2));//-0.10111
console.log(decimal2binary(175.71875), (175.71875).toString(2));//10101111.10111
console.log(decimal2binary(-175.71875), (-175.71875).toString(2));//-10101111.10111