javascript学习--操作符--一元操作符-位操作符

一元操作符

一元操作符指只能操作一个值的操作符

递增和递减操作符

	var a=1,b=2
	var c=a+++b
	console.log(c) //3

递增和递减属于一元操作符,它们的优先级高于加、减和字符串串联(+、-、+),所以c=a+++b可以视作c=(a++)+b,而后置递增或递减操作符,其行为是先把自身的值给到运算中,再进行递增递减操作。通俗来说就是,a++是先给a的值,再执行++;++a是先++,再给a的值

一元加减操作符

一元操作符对于数值来说与数学定义完全一样

	var a=-1,b=2
	a=+a
	b=-b
	console.log(a)  //-1
	console.log(b)  //-2

而对于非数值类型时,就会像Number()一样对这个值先执行转换为数值的操作,再按照数学定义对其进行操作

位操作符

位操作符一般是按内存中表示数值的位来操作数值的,而后台则会让它以一个符合逻辑的方式展现,对程序员来说一般可见的是32位。其中第32位表示符号。注意,位操作符的所有操作都是将看到的十进制转换为二进制再进行操作,操作结束后再将二进制转换为十进制返回

按位非

按位非操作符由~表示,不论底层,它的实际表现行为就是操作数的负值减一

	var a=2
	a=~a
	console.log(a)  //-3

按位与

按位与(&)有两个操作数,本质上来说,是将两个操作数的二进制排开,再对照它们的每一位进行判断,都为1则当前位返回1,其余返回0.

对于程序员来说,执行位操作的数值可见度为32位,那么举个例子,忽略前导零,执行按位与操作:

	var a=3,b=5
	c= a&b
	console.log(c)  //1

以上代码实际上可以看作:
a = 0 0 1 1 (此处省略了32位中的前导零,十进制的3转换为二进制的0011)
b = 0 1 0 1 (同上,十进制的5转换为二进制的0101)
c = 0 0 0 1 (由a、b依据按位与本质得出)
然后第一位的0与0,则对应当前位返回0,以此类推,只有最后一位比较时同为1,返回1,最终返回的是0001,而输出后由后台将二进制转换为十进制,得到1

按位或

按位或(|)的本质与按位与基本相同,只不过是比较时只要有1就在当前位返回1,否则返回0

按位异或

按位异或(^)的本质与按位与也基本相同,只不过比较时只有两个比较数不同就在当前位返回1,否则返回0

左移

左移(<<)会将数值的所有位向左移动指定的位数,左移后空出的空位由0补充,且左移不会影响符号位,例如

	var a=1
	a=a<<3
	console.log(a)  //8

以上代码的底层显示为:
a = 0 0 0 1 (先将十进制转换为二进制,省略了32位中前导的零)
a左移3位 (左移操作会为空出来的位置补充0)
a = 1 0 0 0 (省略了前导零,此时二进制的值为8)
a = 8 (最后输出给控制台的是后台将二进制转换为十进制的结果)

有符号的右移

有符号的右移(>>)将会忽略第32位的符号位,将代表数值的31位数值位整体移动,即不处理符号位,只移动数值位,空出来的空位由符号位的值来补充,若符号位为0则补充0,为1则补充1

	var a=-8
	a=a>>3
	console.log(a)  //-1

以上代码底层显示:
a = 1 …此处省略27个0… 1 0 0 0 (第一位的1表示符号是负号,此为原码,而负数在计算机内是以补码表示)
a = 1 …此处省略27个1… 1 0 0 0 (此为补码)
a = 1 1 1 1 …此处省略24个1… 1 1 1 1 (此时右移完成,将最后三个0移出,并且在符号位后以符号位的值补充了三个1,但是注意,现在还是补码,要输出它必须先转换为原码)
a = 1 0 0 0 …此处省略24个0… 0 0 0 1 (此时是原码)
a = -1 (最后二进制转换为十进制)
无符号的右移

无符号的右移(>>>)会将32位全部向右移,对正数来说,无符号右移与有符号右移相同,对负数来说,无符号右移将会为空出的位补充0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值