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

1,653 阅读3分钟

项目中经常需要0和1互换,特别是切换状态

比如:上架改下架,下架改上架;开启改禁用、禁用改开启等

后端往往是以0/1值来存的

这个时候就需要把0和1互换

当不想用三元表达式 (status === 0 ? 1 : 0) 时

可以用以3种简单方法

1、^按位异或

按位异或: 相同为0, 不同为1

status^1

status^1     // status是1时输出0;status是0时输出1
1^1 // 0

0^1 // 1

2、~按位取反

~status+2

这里需要了解计算机的数据表示 各种数值在计算机中表示的形式称为机器数,其特点是采用二进制计数值,数的符号用0和1表示,机器的最高位是表示正、负数的符号位,(正数最高位是0,负数最高位是1)其余表示数值

现代计算机的机器字长一般都是8位的整数倍

  • 1、原码:如1的原码为00000001
  • 2、反码:正数的反码与原码相同,负数的反码则是其绝对值按位求反
  • 3、补码:正数的补码与其原码和反码相同,负数的补码则等于其反码的末位加1
  • 4、移码:在数X上增加一个偏移量

在计算机系统中,数值用补码来表示和存储

~按位取反运算符:对数据的每个二进制位取反,即把0变成1,把1变成0

求~1

第一步: 1的二进制为00000001

第二步: 取反为11111110,这个数最高位是1,所以是负数

第三步: 补码求原码的方法就是:值取反加1,即11111110取反为00000001再加1为00000010

结合第二步,该值是负数,所以~1的值为-2

求~0

同理

第一步: 0的二进制为00000000

第一步: 取反为11111111,这个数最高位是1,所以是负数

第三步: 求其原码为先取反码00000000再加1得到00000001

结合第二步,该值是负数,所以~0的值为-1

~status+2 // status是1时输出0;status是0时输出1
~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

1-status << status // status是1时输出0;status是0时输出1
(1-1) << 1  // 0
(1-0) << 0 //  1