第三章 基本概念
-
操作符
1.递增递减操作符
这里区分后置型和前置型的赋值区别
var num2 = 20;
var num3 = --num1 + num2; // 等于 21
var num4 = num1 + num2; // 等于 21
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于 22
var num4 = num1 + num2; // 等于 21
由上述代码可以知道,当前置型递减出现的时候,该变量是递减后的值,而后置型递减操作会导致该变量在运行的那条代码中是原数,当执行完后该变量的值才改变。
2.位操作符
IEEE-754 64位 是ECMAScript中的所有数值存储的格式。
我们计算机都是以0 1 存储的,所以在存储的过程中要表示复杂的数值就有它的规律。当要表示具有正负区别的数的时候,就产出了具有符号位的数值。并将1开头表示负数,0开头表示正数。并且,因为计算机只会进行加法,对于减法乘除是基于加法的演变。引用别人的一个例子:“时钟的例子:0时和6时差(10-6)=4时(顺时针),但是你也可以这样写(10+6)-12=4时(逆时针),后一个式子中的6就是“补码”,12表示“定长”,减12表示“溢出”。
补码的存储讲解https://www.cnblogs.com/x_wukong/p/3952688.html。具体怎么求补码反码等操作可以查看相关资料。
在ECMAScript中存在着一些少数几个有关二进制的操作符
按位非(NOT)
var num1 = 25; // 二进制 00000000000000000000000000011001
var num2 = ~num1; // 二进制 11111111111111111111111111100110
alert(num2); // -26
返回的是数值的反码。(反码就是将0和1交换)
按位与(AND)
var result = 25 & 3;
alert(result); //1
规律就是:转换成二进制以后,11取1,01取0,00取0。
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001
按位或(OR)
var result = 25 | 3;
alert(result); //27
规律就是:11取1,10取1,00取0
按异或(XOR)
var result = 25 ^ 3;
alert(result); //26
规律就是:11取0,10取1,00取0
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
说实话一开始自己也觉得不知道有什么用,知道最近在leetcode上刷到这样的题目,可能大家也会有新的认识
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
以下是评论区参考答案:
先思考一下哟~~~~~~·~~~~~~~~~~~~~~_(:°з」∠)_
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
// 交换律:a ^ b ^ c <=> a ^ c ^ b,俩两相同的移到一起
// 相同的数异或为0: n ^ n => 0,只剩下单个的了
// 任何数于0异或为任何数 0 ^ n => n
var s = 0;
for(var i=0;i<nums.length;i++){
s = s^nums[i];
}
return s;
};