0和1互换,别再用三目运算了

项目中经常需要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. 原码:如1的原码为00000001
  2. 反码:正数的反码与原码相同,负数的反码则是其绝对值按位求反
  3. 补码:正数的补码与其原码和反码相同,负数的补码则等于其反码的末位加1
  4. 移码:在数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