操作符
一元操作符
——递增&递减操作符
var a = 12; ++a; // a = a + 1, 此刻 a 值为 13 --a; // a = a - 1, 此刻 a 值为 12 //以上都是语句被求值以前改变——副效应 前置执行前改变
var b = 12; b++; // b 本身此刻 还是 12 var n1 = 3; var n2 = 4; var n3 = n1-- + n2; // n3 = 7, 之后, n1 = 2 var n4 = n1 + n2; // n4 = 6 //
递增递减可以应用到其他类型,规则
一元加操作符:
一元减操作符:
主要用于表示负数——
位操作符
——按照内存中表示数值的位来操作数值
——ECMAScript all 数值 IEEE-754 64 位格式存储
——BUT 位操作符 并不直接操作 64 位的值
——先将 64 位的值转换为 32 位整数, then 执行操作, last 将结果重新转换为 64 位
!!!有符号整数:第 32 位 符号:0 正数 1 负数 前 31 位整数值
!!!负数二进制补码 格式存储
——》求补码:1. 取绝对值二进制码 2. 求反码 3. 得到二进制反码 再 加 1
当然此过程是透明的~~~
!!!副效应!!!
——特殊的 NaN 和 Infinity 应用位操作时, both 被当做 0 处理!!!
——按位非(NOT) : ~
—— return 数值 反码
a = -a -1;// 相同结果,BUT ~ 在数值表示的最底层执行操作,速度就会更快!!!
——》按位非操作本质——操作数负值减1
按位与(AND) &
—— 2 个操作数 both 1 return 1 else return 0
按位或(OR) |
—— 2 个操作数 both 0 return 0 else return 1
按位亦或(XOR) ^
—— 2 个操作数 same return 0 different return 1
左移 <<
—— 将数值所有位向左移动指定位数
左移 << 5 原来数值的右侧多出 5 位空格 以 0 填充
!!!<< 不会影响符号位
有符号右移 >>
——向右移动、保留符号位
符号位填充所有空位
无符号右移 >>>
—— 将所有 32 位 都向右移动
正数同 >>
负数!!!无符号右移以 0 填充空位
—— 无符号右移操作符 会将负数的二进制码 当成正数的二进制码QAQ
—— cause 负数以其绝对值的二进制补码形式表示,
—— then 无符号右移后的结果就Max MAX !!!
原文地址:https://www.cnblogs.com/haixiaomei/p/a2.html