位运算符学习

116 阅读3分钟
 console.log(2 & 1) 
 00000000   00000000   00000000   00000010
 00000000   00000000   00000000   00000001
console.log(3 & 1)
00000000   00000000   00000000   00000011
00000000   00000000   00000000   00000001
console.log(4 & 1)
00000000   00000000   00000000   00000100 
00000000   00000000   00000000   00000001

只要是奇数最后一位一定是1,然后&1则为1 只要是欧式最为以为一定是0,然后&1则为0

console.log(~~ 6.83) 
//先转化为整数
00000000   00000000   00000000   00000110
//取反
11111111   11111111   11111111   11111001
//内部补码(-1)
11111111   11111111   11111111   11111000
//取反
00000000   00000000   00000000   00000111
//值= -7
//-7以补码的形式存,即:
11111111   11111111   11111111   11111001再取反就是:
00000000   00000000   00000000   00000110
//最终得到6


console.log( 6.83>>0) 
//先转化为整数
00000000   00000000   00000000   00000110
//右移零位置,补不到左边的,补空
//得到6


console.log(6.83 << 0)  // 6
//先转化为整数
00000000   00000000   00000000   00000110
//左移零位置,补不到零,补空


console.log(6.83 | 0)   // 6
先转化为整数
00000000   00000000   00000000   00000110
//与0按位或
00000000   00000000   00000000   00000000
//得到
00000000   00000000   00000000   00000110
var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a)   // 8
console.log(b)   // 5
 //a
 00000000   00000000   00000000   00000101
 //10
 00000000   00000000   00000000   00001010
 //5
 00000000   00000000   00000000   00000101
 10|5 =15
 //总结
 1.&运算符的特点遇00 ,用途:判断奇偶    偶数 & 1 = 0   奇数 & 1 = 1
 2.|没什么特点                     用途:~、>>、<<、>>>、|来取整:
 3.^按位异或的3个特点:
  1.0 ^ 0 = 0 , 0 ^ 1 = 1, 0异或任何数=任何数。
  2.1^任意正奇数,为两值相减(后者前去前者),1^任意正偶数,为两值相加。1^任意负偶数为两值相  加,1^任意负奇数为两值绝对值相加取反
  3.)任何数异或自己 = 把自己置04.<<左移n,放大2的n次方倍
 5.>>有符号右移n(符号传播,右移留出的左空缺补之前未右移位的值,即保留符号),缩小2的n次方倍,保留符号
 6.>>>无符号右移n(符号传播,右移流出的左空缺直接补0),缩小2的n次方倍

2.示例

 //1^7
 //1
 00000000   00000000   00000000   00000001
 //7
 00000000   00000000   00000000   00000111
 00000000   00000000   00000000   00000110
 //6

未完成:

3.使用^来完成值交换:

var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a)   // 8
console.log(b)   // 5

4.使用&, >>, |来完成rgb值和16进制颜色值之间的转换:

/**
 * 16进制颜色值转RGB
 * @param  {String} hex 16进制颜色字符串
 * @return {String}     RGB颜色字符串
 */
  function hexToRGB(hex) {
    var hexx = hex.replace('#', '0x')
    var r = hexx >> 16
    var g = hexx >> 8 & 0xff
    var b = hexx & 0xff
    return `rgb(${r}, ${g}, ${b})`
}

/**
 * RGB颜色转16进制颜色
 * @param  {String} rgb RGB进制颜色字符串
 * @return {String}     16进制颜色字符串
 */
function RGBToHex(rgb) {
    var rgbArr = rgb.split(/[^\d]+/)
    var color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]
    return '#'+ color.toString(16)
}
// -------------------------------------------------
hexToRGB('#ffffff')               // 'rgb(255,255,255)'
RGBToHex('rgb(255,255,255)')      // '#ffffff'


转自作者:奇瑞 链接:juejin.cn/post/692290… 来源:稀土掘金