位运算符
七进制数
details
/**
* 尝试用位运算符处理 ???????
*
* @param {number} num
* @return {string}
*/
var convertToBase7 = function(num) {
const positive = num > 0;
let ans = '';
// 负数需要转换为正数
if (num < 0) {
num = -num;
}
if (num === 0) {
return '0';
}
while (num > 0) {
ans = `${num % 7}${ans}`;
num = (num / 7) >> 0;
}
return positive ? ans : `-${ans}`;
};
数字转换为十六进制数
details
var toHex = function(num) {
if (num === 0) {
return '0';
}
const sb = [];
for (let i = 7; i >= 0; i--) {
const val = (num >> (4 * i)) & 0xf;
if (sb.length > 0 || val > 0) {
const digit =
val < 10
? String.fromCharCode('0'.charCodeAt() + val)
: String.fromCharCode('a'.charCodeAt() + val - 10);
sb.push(digit);
}
}
return sb.join('');
};
位 1 的个数
details
/**
* 位 1 的个数
* @param {number} n - a positive integer
* @return {number}
*/
var hammingWeight = function(n) {
let ans = 0;
for (let i = 0; i < 32; i++) {
// 取出最后一位
ans += (n >> i) & 1;
// 终止
if (n >> i === 0) {
break;
}
}
return ans;
};
/**
* 位 1 的个数
* @param {number} n - a positive integer
* @return {number}
*/
var hammingWeight = function(n) {
let ans = 0;
while (n !== 0) {
// 取出的第一位一定是 1
n = n & (n - 1);
ans++;
}
return ans;
};
颠倒二进制位
details
/*
* 颠倒二进制位
* @param {number} n - a positive integer
* @return {number} - a positive integer
*/
var reverseBits = function(n) {
let ans = 0;
for (let i = 0; i < 32 && n > 0; ++i) {
ans |= (n & 1) << (31 - i);
n >>>= 1;
}
return ans >>> 0;
};
/*
* 颠倒二进制位
* @param {number} n - a positive integer
* @return {number} - a positive integer
*/
var reverseBits = function(n) {
let i = 0;
let j = 31;
const ans = new Array(32).fill(0);
while (i <= j) {
//依次取出 第 i位
const right = (n >> i) & 1;
const left = (n >> j) & 1;
ans[i] = right;
ans[j] = left;
console.log(left, right);
i++;
j--;
}
console.log(ans.join(''));
return parseInt(ans.join(''), 2);
};
两整数之和
details
/*
* 两整数之和
* @param {number} a
* @param {number} b
* @return {number}
*/
var getSum = function(a, b) {
// 进位 + 非进位
// 异或可把进位与非进位 相加
while (a !== 0) {
const temp = a ^ b;
// 进位
a = (a & b) << 1;
// 非进位
b = temp;
}
return b;
};