项目中经常需要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