文章目录
在学习位运算符的同时,经常会思考这些操作符到底在实践当中有何用处?接下来跟大家分享我的理解。
提示:以下是本篇文章正文内容,下面案例可供参考
一、位操作符的基本运算符
位操作符用于数值的底层操作,也就是操作内存中表示数据的比特(位)。
1.按位非
按位非操作符用(~)表示,,用于返回数值的一补数。它运算的最终结果是对数值取反并减1。
let num1=25; //二进制 0000 0000 0000 0000 0000 0000 0000 0011
let num2= ~num1; //二进制 1111 1111 1111 1111 1111 1111 1111 1100
console.log(num2); //-26
等同于以下代码,但位操作的速度快得多,由于位操作是在数值的底层上表示完成的。
let num1=25;
let num2=-num1-1;
console.log(num2); //"-26"
2.按位与
按位与操作符用(&)表示,有两个操作数。只有两个操作数相应的比特位都是1时,结果才为1,否则为0。
let result=25 & 3;
console.log(result); // 1
在二进制中:
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
AND=0000 0000 0000 0000 0000 0000 0000 0001
因此结果为1。
3.按位异或
按位异或操作符( ^ )表示,有两个操作数。两位都是1或0,则返回0。
let result=25^3;
console.log(result); // 26
在二进制中:
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
XOR=0000 0000 0000 0000 0000 0000 0001 1010
因此结果为26。
4.按位或
按位或操作符用(|)表示,有两个操作数。至少一位是1时返回1,两位都是0时返回0;
let result=25 | 3;
console.log(result); // 27
在二进制中:
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
OR=0000 0000 0000 0000 0000 0000 0001 1011
因此结果为27。
5.左移
左移操作符用(<<)表示,按照指定的位数将数值的所有位向左移动。
let before=2; //等于二进制10
let after=before<<5; //等于二进制1000000,即为十进制64
6.有符号右移
有符号右移用(>>)表示,将数值的32位都向右移,并保留符号(正或负)。
let before=64; //等于二进制1000000
let after=before>>5; //等于二进制10,即为十进制2
7.无符号右移
无符号右移用(>>>)表示,将数值的32位都向右移,无符号右移会给空位补0,不管是符号位是什么!对于正数无符号右移与有符号右移结果相同。
let before=-64; //等于二进制1111 1111 1111 1111 1111 1111 1100 0000
let after=before>>>5; //等于十进制134217726
二、实际运用
1.使用&运算符判断奇偶
是奇数还是偶数取决于二进制中第一操作位是0还是1,由于按位与只有当两位操作数对应的比特位都是1才返回1。所以可以根据判断数与1进行按位与运算判断奇偶。
//偶数&1=0
//奇数&1=1
console.log(2&1); // 0
console.log(3&1); // 1
2.使用~~,<<,>>>,>>.|运算符取整
需要注意的是无符号右移(>>>)运算符不能对负数取整
console.log(~~9.68); //-(-9-1)-1,即9
console.log(9.68>>0); //9
console.log(9.68>>>0); //9
console.log(9.68<<0); //9
console.log(9.68|0); //9
3.使用^运算符实现值交换
var a=6;
var b=4;
b^=a;
a^=b;
console.log(a); //4
console.log(b); //6
4.使用^运算符判断两个数是否相等
此文章是作为我在学习过程中的学习心得,若有错误欢迎指出!