当前位置: 首页 > Web前端 > JavaScript

【转】按位运算符在JS中的神奇使用

时间:2023-03-26 23:56:28 JavaScript

所有JavaScript的数字都存储为64位(8位)以10为根的浮点数。JavaScript不是类型化语言。与许多其他编程语言不同,JavaScript不定义整数、短整数、长整数、浮点数等不同类型的数字。整数精度(不带小数点或指数符号)最多为15位。小数精度的最大位数是17,但浮点运算并不总是100%准确。位运算直接计算二进制位,位运算直接对每一位进行处理。这是一个非常低级的操作。优点是速度极快,缺点是很不直观,不能在很多场合使用。位运算仅适用于整数。如果操作数不是整数,则在运行前会自动转换为整数。在JavaScript内部,值是以64位浮点数的形式存储的,但是在进行位运算时,是用32位有符号整数进行运算,返回值也是32位有符号整数.JS中常用的7位运算符是按位与(AND)&&以特定的方式对二进制数中的对应位进行运算。如果对应的位全为1,则结果为1。如果任何位为0,则结果为0。//1的二进制表示为:00000000000000000000000000000001//3的二进制表示为:00000000000000000000000000000011//------------------------------//1的二进制表示为:00000000000000000000000000000001console.log(1&3)//1按位或(OR)||之间的区别operatorand&就是如果操作对应的位中的任意一位如果数字为1则结果为1//1的二进制表示为:00000000000000000000000000000001//3的二进制表示为:00000000000000000000000000000011//-----------------------------//3的二进制表示为:00000000000000000000000000000011console.log(1|3)//3位异或(XOR)^^如果对应的两个运算位只有一个1,则结果为1,其他为0。//1的二进制表示是:00000000000000000000000000000001//3的二进制表示是:00000000000000000000000000000011//-------------------------------//2的二进制表示为:00000000000000000000000000000010console.log(1^3)//2按位非(NOT)~~运算符是取反位,1变成0,0变成1,也就是求二进制的补码。//1的二进制表示是:00000000000000000000000000000001//3的二进制表示是:00000000000000000000000000000011//-------------------------------//1的补码二进制表示:11111111111111111111111111111110//由于第一位(符号位)为1,所以这个数为负数。JavaScript内部使用补码表示负数,即需要将这个数减1,再取倒数,再加一个负号,得到负数对应的十进制值。//----------------------------//1减1的反码:11111111111111111111111111111101//反码取反:00000000000000000000000000000010//表示为十进制加减号:-2console.log(~1)//-2简单记忆:一个数与自身的取反值相加等于-1。左移(Leftshift)<<<<运算符将指定值的二进制数的所有位向左移动指定次数。移动规则:舍去高位,低位补0,即把所有数向左移动二进制数对应的位,高位去掉(舍弃),低位补上与零。//1的二进制表示是:00000000000000000000000000000001//------------------------------//的二进制表示2is:00000000000000000000000000000010console.log(1<<1)//2signedrightshift>>>>此运算符会将指定操作数的二进制位向右移动指定的位数。向右移出的位被丢弃,最左边的位被复制以填充左侧。由于新的最左边的位总是和以前一样,符号位没有改变。这就是为什么它被称为“符号通信”。//1的二进制表示是:00000000000000000000000000000001//------------------------------//的二进制表示0is:00000000000000000000000000000000console.log(1>>1)//0无符号右移>>>>>>此运算符将第一个操作数向右移动指定的位数。右移的位被丢弃,左边补0。因为符号位变为0,所以结果总是非负的。(译注:即使右移0位,结果也不是负数。)对于非负数,有符号和无符号右移总是返回相同的结果。例如,9>>>2得到2和9>>2是一样的。js中位运算符的妙用用&运算符判断一个数的奇偶性//Even&1=0//Odd&1=1console.log(2&1)//0console.log(3&1)//1使用~,>>,<<,>>>,|汇总console.log(~~6.83)//6console.log(6.83>>0)//6console.log(6.83<<0)//6console.log(6.83|0)//6//>>>不能对负数进行舍入console.log(6.83>>>0)//6使用^完成价值交换vara=5varb=8a^=bb^=aa^=bconsole.log(a)//8console.log(b)//5使用&,>>,|完成rgb值与十六进制颜色值的转换/***hexadecimal颜色值转RGB*@param{String}hex十六进制颜色字符串*@return{String}RGB颜色字符串*/functionhexToRGB(hex){varhexx=hex.replace('#','0x')varr=hexx>>16varg=hexx>>8&0xffvarb=hexx&0xffreturn`rgb(${r},${g},${b})`}/***RGB颜色转换十六进制颜色*@param{String}rgbRGB十六进制颜色字符串*@return{String}十六进制颜色字符串*/functionRGBToHex(rgb){varrgbArr=rgb.split(/[^\d]+/)varcolor=rgbArr[1]<<16|rgbArr[2]<<8|rgbArr[3]return'#'+color.toString(16)}//------------------------------------------------hexToRGB('#ffffff')//'rgb(255,255,255)'RGBToHex('rgb(255,255,255)')//'#ffffff'参考https://developer.mozilla.org...http://javascript.ruanyifeng....http://www.w3school.com.cn/js...