左移位运算符
35>>1 //17
35>>2 //8
- 35转换成二进制为100011
-
35>>1
100011左移一位为10001 - 10001 转换成十进制为17
-
35>>2
100011左移两位为1000 - 1000 转换成十进制为8
右移位运算符
2<<3 //16
5<<4 //80
- 2转换成二进制为10
-
2<<3
10右边补3位0为10000 - 10000 转换成十进制为16
- 5转换成二进制为101
-
5<<4
101右边补4位0为1010000 - 1010000 转换成十进制为80
以下为javascript实现的十进制与二进制相互转换及左移、右移位运算
/**
* 十进制转换二进制
* @param {*} num
*/
function dec2bin(num) {
if (num > 0) {
// console.log(baseDec2bin(num));
return baseDec2bin(num)
} else if (num < 0) {
/**
* 1.负数取反
* 2.转为二进制
* 3.补齐8位
* 4.01取反
* 5.+1
*/
num = -(num);
let result = baseDec2bin(num);
let binarr = result.split('');
let len = 8 - binarr.length;
for (let i = 0; i < len; i++) {
binarr.unshift('0')
}
let newbinarr = [];
binarr.map((val) => {
val == 0 ? newbinarr.push('1') : newbinarr.push('0')
})
newbinarr[newbinarr.length - 1] == 0 ? newbinarr[newbinarr.length - 1] = 1 : add(newbinarr);
function add(num) {
num[num.length - 1] = '0';
for (let i = num.length - 2; i >= 0; i--) {
if (num[i] == 1) {
num[i] = '0'
} else if (num[i] == 0) {
num[i] = '1'
break
}
}
}
// console.log(Number(newbinarr.join('')))
return Number(newbinarr.join(''))
} else {
return 0;
}
}
/**
* 二进制转换十进制
* @param {*} num
*/
function bin2dec(num) {
typeof num == Number ? null : num = String(num)
if (!typeof num == Number) return console.log('请输入数字');
/**
* 1.判断正负 高位为0为正数 高位为1为负数
*/
let numArr = num.split('');
let isBin = numArr.every((value) => {
return value == '0' || value == '1'
})
if (num.length < 8) {
return baseBin2dec(num)
} else if (num.length == 8 && isBin) {
/**
* 1.-1
* 2.01取反
* 3.去掉前置0
* 4.转为十进制
* 5.取反
*/
numArr[numArr.length - 1] == 1 ? numArr[numArr.length - 1] = '0' : add(numArr);
function add(num) {
num[num.length - 1] = '1';
for (let i = num.length - 2; i >= 0; i--) {
if (num[i] == 0) {
num[i] = '1'
} else if (num[i] == 1) {
num[i] = '0'
break
}
}
}
let newbinarr = [];
numArr.map((val) => {
val == 0 ? newbinarr.push('1') : newbinarr.push('0')
})
for (let i = 0; i < newbinarr.length - 1; i++) {
if (newbinarr[i] == '0') {
delete newbinarr[i]
} else {
break;
}
}
let dec = Number(newbinarr.join(''))
// baseBin2dec(dec)
return -(baseBin2dec(dec))
} else {
return console.log('请输入正确的二进制数字')
}
}
/**
* 位运算 m>>n
* m转换为二进制之后倒叙删除掉n位
*/
function leftBitOperation(m, n) {
let copy = m;
m = dec2bin(m);
let len = m.length;
m = m.substr(0, len - n);
// console.log(`${copy}>>${n}:${bin2dec(m)}`);
return bin2dec(m);
}
// leftBitOperation(35, 4);
/**
* 位运算 m<<n
* m转换为二进制之后添加n位0
*/
function rightBitOpration(m, n) {
let copy = m;
m = dec2bin(m);
for (let i = 0; i < n; i++) {
m += 0;
}
m = bin2dec(m);
// console.log(`${copy}<<${n}:${m}`);
return m;
}
// rightBitOpration(5, 4)
/**
* 基础十进制转二进制,参数只支持正数
* @param {*} num
*/
function baseDec2bin(num) {
let result = '';
for (let i = 2; num / i > 0;) {
let remain = num % 2;
num = (num / 2) | 0;
result += remain;
}
result = result.split('').reverse().join('');
return result;
}
/**
* 基础二进制转十进制,参数只支持正数
* @param {*} num
*/
function baseBin2dec(num) {
typeof num == Number ? null : num = String(num)
if (!typeof num == Number) return console.log('请输入数字');
let result;
for (let i = 0, s = 0; i < num.length; i++) {
result = 2 * s + Number(num[i]);
s = 2 * s + Number(num[i]);
}
return result;
}