js中如何用整夜表达式判断1到1000以内的正整数

JavaScript035

js中如何用整夜表达式判断1到1000以内的正整数,第1张

你好,是正则表达式吧?

两个规则:

1、正整数:无符号(或+)开头:(^\+?)

2、1-1000:考虑是否包含上边界,如包含稍微麻烦一点点,如不包含简单点

具体代码如下:

var reg = /^\+?[1-9]\d{0,2}$/ // 不包含边界

var regFull = /^(\+?[1-9]\d{0,2}|\+?1000)$/ // 包含上边界

下面我们看几个测试用例:

'1000'.match(regFull) // ["1000", "1000"]

'+1000'.match(regFull) // ["+1000", "+1000"]

'999'.match(regFull) // ["999", "999"]

'+999'.match(regFull) // ["+999", "+999"]

'1'.match(regFull) // ["1", "1"]

'0'.match(regFull) // null

'-999'.match(regFull) // null

'1001'.match(regFull) // null

好了,一切正常。但是我们忽略了另一种情况:

'001'.match(regFull) // null

'+001'.match(regFull) // null

但实际他们都是在这个区间内的正整数。我们可以这么做:

(+'+001' + '').match(regFull) // ["1", "1"]

(+'001' + '').match(regFull) // ["1", "1"]

好了,都解决了。

希望是你想要的答案,望采纳~~

尊敬的用户您好:

建议您在金山卫士的软件管理里下载安装最新的金山毒霸2013解决。

新一代的金山毒霸2013相对以往版本更加强大,有以下六点特点:

1.引擎全新升级,杀毒更极致全面

蓝芯给力升级到蓝芯III,内置全新KVM云启发引擎,查杀新病毒和流行病毒更出色:

小U高启发引擎,断网环境大杀器:自主创新研发小U引擎,高启发查杀U盘病毒,修复U盘文件异常,带给U盘极致安全保护,直接阻断断网环境下病毒感染电脑的唯一渠道。

云地结合,完美杀毒:自主研发五引擎结合国外知名杀毒引擎小红伞,云地结合杀毒,带给用户电脑极致安全感。

2.全新系统保护

全新架构,新一代的云主防:防御策略智能灵活、性能轻巧、极速。可疑行为拦截更精准、更快速。客户端不仅可拦截已知威胁,并与金山云安全中心3.0紧密联动,云端可将用户端侦测到的新型威胁,智能转换为拦截规则,通过云指令发送到用户,可秒级拦截新型威胁。系统保护结合火眼在线分析系统侦测的危险信息,可辅助云端更加精准识别病毒,增强云安全的特征识别。为其他防御及查杀提供云特征信息,使新型病毒无法传播、无处藏身。

断网模式保护:新增断网模式下的系统主防,保护系统内核安全。

3.上网保护引入火眼分析系统

上网保护接入全新火眼分析系统:以客户端与云端的多维联动,智能分析病毒木马的恶意行为,并根据病毒危害等级或行为特点,为用户提供最佳拦截方案。同时,火眼分析系统在云端生成可供用户阅读的详尽分析报告,用户只需在上网保护的弹泡提示中一键调用查阅,即可对病毒行为了如指掌,满足用户深入了解自己电脑安全状况的需求。

下载保护所涵盖的范围更广:除了对主流的浏览器、下载工具全部支持外,还支持了ftp.exe和常用网盘。对于传输办公文档时可能存在的宏病毒脚本,下载保护的拦截也更加准确,还可以提供一站式文件修复,还用户一个安全的文档处理环境。

4.全新交互,拦截泡泡操作更加人性化

5.首创电脑、手机双平台杀毒

6.全新安装动画 (依然酷炫,依然震撼)

官网地址:www.ijinshan.com

感谢您的支持,祝您生活愉快!

之前对js的一些涉及到二进制的运算符一直似懂非懂,看到了就一脸懵逼,还得去控制台算一下。然后最近看算法的时候又看到了这个运算符,这里就简单介绍一下学习这些位运算符的过程。

注意: 以下运算均不涉及到小数。

先说这句话是什么意思。左移位是二进制的一种运算,就是在不改变二进制数值32位长度的前提下,将每位的数字都向左移动,左边移出去的直接丢弃,右边空出来的位置用0填充。无符号就是保持符号位不变,即本来是正数,移位后一样为正数。

这里以 7 <<2 为例。

首先将7转为二进制是 0000 0000 0000 0000 0000 0000 0000 0111 .

然后对其向左移两位.

得到值为 0000 0000 0000 0000 0000 0000 0001 1100 .

转换为十进制为 28.即 7 <<2 = 28 。

然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。

对移位后的算式进行合并项可得到 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 ,即 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 = 7 * 2^2 。由此我们可得出 7 <<2 = 7 * 2^2 = 28 。

我们通过计算几个简单的左移位运算,与标准答案进行比较,验证一下这个结论。

在控制台中以上几个算式的结果为

答案完全一致。说明我们的结论是正确的。当然这个结论 仅限于那些二进制移位不会左移移出的数字的简单运算 。当我们遇到一些简单的可以口算的左移位运算时就可以使用这个结论快速得到结果,如果对于 99999 <<66 这种较复杂的运算你也用这个结论计算,也没有人会介意。

下面我们看一下负数的左移位运算。以 -66 <<2 为例。

首先,我们先复习一下负数如何转换为二进制。

负数转换为二进制的步骤有三:

然后对其向左移两位.

得到值为 1111 1111 1111 1111 1111 1110 1111 1000 .然后我们将其转换成十进制。

转换为十进制为 -264.即 -66 <<2 = -264 。

刚刚我们计算 -66 的二进制得到的是 1111 1111 1111 1111 1111 1111 1011 1110 。我们在控制台验证一下我们得到的这个二进制。

我们比较一下下面几个算式。

是的没错,进行无符号左移位运算时,当两个数的绝对值相等时,其相同位数的移位的绝对值一定相等。

这里以 666 >>3 为例。

首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。

然后对其向右移三位。

得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .

转换为十进制为 83.即 666 >>3 = 83 。

然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。

这个规律好像不太好总结?

这里以 -666 >>3 为例。

因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。

即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算

移位后得到的值为 1111 1111 1111 1111 1111 1111 1010 1100 ,是一个负值,我们将其转成十进制。

我们对此结果进行验证。

可见,我们的运算是完全正确的。

这里我们以 666 >>>3 为例。

首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。

然后对其向右移三位。

得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .

转换为十进制为 83.即 666 >>3 = 83 。

这里以 -666 >>3 为例。

因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。

即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算

移位后得到的值为 0001 1111 1111 1111 1111 1111 1010 1100 ,转成十进制为536870828。

是不是超级大。因为是无符号右移位运算,所以在左边空出部分不论正负都会填充0.

我们对此结果进行验证。

可见,我们的运算是完全正确的。

注意:因为对负数进行无符号右移位运算时,所得结果很大,所以在使用过程中需要格外注意。

疑问:左移位和右移位根本都是只对位置进行了移动,那么对于 x1 >>k = y1 和 y2 <<k = x2 中的 x1 等于 x2 , y1 等于 y2 吗?

不一定。因为我们不能确保移动过程中被丢弃的值均为0。但凡有一个1被丢弃,就不会相等。而如果被丢弃的都是0,那么 x1 === x2 y1 === y2 。如下图所示。

这里以 66 &33 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0010 0001 。

然后对其进行与运算。

得出结果为 0.

负数的与运算与正数并无区别,不做讨论。

这里以 66 | 66 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。

然后对其进行与运算。

得出结果为 66.

负数的与运算与正数并无区别,不做讨论。

这里以 66 ^ 66 为例。

首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。

然后对其进行与运算。

得出结果为 0.

负数的与运算与正数并无区别,不做讨论。

这里以 ~66 为例。

首先将其转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 。

然后对其进行与运算。

将结果( 1111 1111 1111 1111 1111 1111 1011 1101 )转换为十进制

得出结果为 -67.

这里我们再我看几个例子。

从中我们可以看出, 位非操作就是对数字加一,然后取负 。我们可以写个简单的判断方法来验证。

位运算符运算结果非常有趣,在平时可以多加应用,但是一定要注意可能产生大数的预算,避免产生不必要的BUG。

这篇文章只是做了一个简单的介绍。后面有空了会做一下在实际开发中的应用,虽然我可能很久都遇不到。

JavaScript学习指南:JS入门教程