项目中经常需要0和1互换,特别是切换状态
比如:上架改下架,下架改上架;开启改禁用、禁用改开启等
后端往往是以0/1值来存的
这个时候就需要把0和1互换
当不想用三元表达式 (status === 0 ? 1 : 0) 时
可以用以3种简单方法
1、^按位异或
js
status^1 // status是1时输出0;status是0时输出1
js
1^1 // 0
0^1 // 1
2、~按位取反
这里需要了解计算机的数据表示
各种数值在计算机中表示的形式称为机器数,其特点是采用二进制计数值,数的符号用0和1表示,机器的最高位 是表示正、负 数的符号位,其余表示数值
现代计算机的机器字长一般都是8位的整数倍
- 原码:如1的原码为00000001
- 反码:正数的反码与原码相同,负数的反码则是其绝对值按位求反
- 补码:正数的补码与其原码和反码相同,负数的补码则等于其反码的末位加1
- 移码:在数X上增加一个偏移量
在计算机系统中,数值用补码来表示和存储
~按位取反运算符:对数据的每个二进制位取反,即把0变成1,把1变成0
求~1
1的二进制为00000001
取反为11111110
补码求原码的方法就是:值取反加1
11111110取反为00000001再加1为00000010
而该值是负数,所以~1的值为-2
求~0
同理0的二进制为00000000
取反为11111111,求其原码为先取反码00000000再加1得到00000001
而该值是负数,所以~0的值为-1
js
~status+2 // status是1时输出0;status是0时输出1
js
~0+2 // 1
~1+2 // 0
3、<<移位运算符
<<运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
(1-n) << n
计算 1 - 1 << 1
0的二进制为 00000000 向左移1位为 00000000,结果为0
计算 1 - 0 << 0
1的二进制为 00000001 向右移0位为 00000001, 结果为1
js
1-status << status // status是1时输出0;status是0时输出1
js
(1-1) << 1 // 0
(1-0) << 0 // 1