JavaScript高级程序设计笔记记录(三)基本概念【中】

第三章 基本概念

  • 操作符

   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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值