JS位运算符

之前对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入门教程



  • js涓繖浜涚鍙锋槸浠涔堟剰鎬:&,||,===,!,++
    绛旓細&锛氶昏緫涓庯紝&&鍚屾牱鍙互琛ㄧず閫昏緫涓庯紱||锛氶昏緫鎴栵紝|涔熷彲浠ヨ〃绀洪昏緫鎴栵紱锛濓紳锛濓細鍏堝垽鏂乏鍙充袱杈圭殑鏁版嵁绫诲瀷锛屽鏋滄暟鎹被鍨嬩笉涓鑷达紝鐩存帴杩斿洖false锛涳紒锛氶昏緫闈烇紱锛嬶紜锛氳嚜鍔犵鍙凤紝鍦ㄥ師鏈夌殑鍩虹涓婂姞涓1锛js杩愮畻绗鍙岀珫鏉犫渱|鈥濈殑鐢ㄦ硶 1銆JS鍙岀珫绾胯繍绠楃锛氭槸鎴栨瘮杈冦傚null||鈥1鈥欙紝杩斿洖鈥1鈥;鈥2鈥檤...
  • js涓">>"杩欎釜绗﹀彿鏈変粈涔堢敤?
    绛旓細js涓">>"杩欎釜绗﹀彿浣滅敤鏄妸涓涓暣鍨嬫暟鐨勬墍鏈変綅鍚戝彸绉诲姩鎸囧畾鐨勪綅鏁帮紝绉诲姩鍒板彸杈圭晫涔嬪鐨勫浣欎簩杩涘埗浣嶄細琚涪寮冿紝骞朵粠宸﹁竟鐣岀Щ鍏ヤ竴涓簩杩涘埗浣嶏紝鑻ュ師鏁扮殑鏈楂樹綅涓1锛屽垯绉诲叆鐨勪簩杩涘埗浣嶄负1锛屽惁鍒欎负0銆備唬琛ㄥ彸绉杩愮畻绗锛屽氨鐩稿綋浜庘渟hr鈥濄傝杩愮畻绗︿负鍙岀洰杩愮畻绗︼紝缁撳悎鏂瑰悜涓轰粠宸﹀埌鍙炽
  • js涓璿alue^= 鏄粈涔堟剰鎬
    绛旓細js涓璿alue^= 鏄寜浣嶅紓鎴栬祴鍊杩愮畻绗锛屽彸闈㈢殑鍊煎紓鎴朧ALUE 鐒跺悗璧嬪肩粰VALUE銆俕鏄紓鎴栬繍绠楃锛屽紓鎴栫殑瑙勫垯鏄浆鎹㈡垚浜岃繘鍒舵瘮杈冿紝鐩稿悓涓0锛屼笉鍚屼负1.涓涓暟a涓庡彟涓涓暟b寮傛垨鐨勭粨鏋滅瓑浜巃^b锛岀敤缁撴灉锛 a^b)寮傛垨a锛屽氨浼氬緱鍒癰锛涗笂闈㈢殑缁撴灉鐢ㄤ唬鐮佹潵楠岃瘉銆備唬鐮( a=a^b; b=a^b; a=a^b;)鍙互杞崲鎴...
  • js 涓=== !== || !! 鏄粈涔堟剰鎬?
    绛旓細"0x" 鎸囨槑鏄崄鍏繘鍒("hex") 锛宆 鏄寜浣嶅紓鎴栵紝& 鏄寜浣嶄笌锛 | 鏄寜浣嶆垨锛岃繖浜涢兘鏄浣嶈繍绠楃锛屽彲浠ヤ娇鐢╳indows涓殑璁$畻鍣ㄦ潵璁$畻锛屾妸璁$畻鍣ㄨ缃垚鈥滅瀛﹀瀷鈥濓紝浣跨敤鈥滃崄鍏繘鍒垛濊緭鍏ffffff锛屸淴or鈥濇槸^锛屸淎nd鈥濇槸&锛屸淥r鈥濇槸|锛岀粨鏋滄槸103锛屼篃鍙互鍐欐垚涓涓猦tm鏂囦欢鐢↖E鐪嬩竴涓嬬粨鏋 onmouseover ...
  • 銆怶eb鍓嶇鍩虹銆js杩愮畻绗鏈夊摢浜?
    绛旓細JavaScript涓殑杩愮畻绗鏈夊緢澶氾紝涓昏鍒嗕负绠楁湳杩愮畻绗︼紝绛夊悓鍏ㄥ悓杩愮畻绗︼紝姣旇緝杩愮畻绗︼紝瀛楃涓茶繍绠楃锛岄昏緫杩愮畻绗︼紝璧嬪艰繍绠楃绛夈傝繖浜涜繍绠楃閮芥湁涓浜涘睘浜庤嚜宸辩殑杩愮畻瑙勫垯锛屼笅闈㈠氨涓哄ぇ瀹朵粙缁嶄竴涓婮avaScript涓殑杩愮畻绗︺備竴銆丣avaScript杩愮畻绗︾殑绉嶇被 1銆佺畻鏈繍绠楃锛+ 銆 - 銆* 銆 / 銆 % 銆 -(涓鍏冨彇鍙) 銆...
  • 鍦↗avascript涓璽est()鐨勬鍒欒〃杈惧紡鍓嶆湁涓や釜娉㈡氮鍙锋槸浠涔堟剰鎬?
    绛旓細~鍦js涓槸浣嶆搷浣滅涓殑(姹傚弽) 鍙嶈浆鎿嶄綔銆傜洰鐨勬槸灏嗘祴璇曠粨鏋滆浆鎹㈡垚bollen鍊.
  • js浠g爜涓浣曞垽鏂暟瀛楃櫨浣嶈兘琚3鏁撮櫎
    绛旓細falsetest(305); //return truetest(4911); // return truetest(4821); // return false璇存槑:: 鏁撮櫎杩愮畻, 7%3 = 1, 8%3=2, 9%3=0 /: 闄ゆ硶杩愮畻, 鍦js涓, 4/2=2, 5/2=2.5, 5/3=1.6666666666666667 |: 浣嶈繍绠楃, 鍙互鐢ㄦ潵鍙栨暣, 2.4 | 0 =2, 2.6 | 0 = 2 ...
  • js涓%浠涔堟剰鎬
    绛旓細1銆佸湪Javascript涓紝鍦ㄨ鍙ユ墽琛屼腑锛%浠h〃鍙栨ā锛屼織绉板彇浣欐暟锛屼緥濡 10%10 return value: 0 10%20 return value: 10 2銆佸湪娴忚鍣ㄥ湴鍧缂栫爜涓紝%鍙互浠h〃涓涓紪鐮佺殑寮濮嬶紝渚嬪 20 浠h〃鐨勬槸绌烘牸 Javascript鑴氭湰璇█鍚屽叾浠栬瑷涓鏍凤紝鏈夊畠鑷韩鐨勫熀鏈暟鎹被鍨嬶紝琛ㄨ揪寮忓拰绠楁湳杩愮畻绗 鍙婄▼搴忕殑鍩烘湰绋嬪簭妗嗘灦銆
  • 浣犲ソ,js涓 浣跨敤~~鍙互鍘绘帀瀛楃涓插紑澶寸殑0 浣嗗鏋滃叏鏄暟瀛楀苟寰堥暱鐨勮瘽...
    绛旓細鎸変綅鈥滈潪鈥杩愮畻绗 (~)瀵逛竴涓〃杈惧紡鎵ц鎸変綅鈥滈潪鈥濓紙鍙栧弽锛夈俽esult = ~ expression 鍙傛暟 result 浠讳綍鍙橀噺銆俥xpression 浠讳綍琛ㄨ揪寮忋傝鏄 鎵鏈変竴鍏冭繍绠楃锛屽 ~ 杩愮畻绗︼紝浠ュ涓嬭鍒欐潵姹傝〃杈惧紡鐨勫硷細濡傛灉灏嗗畠鐢ㄤ簬 undefined 鎴 null 琛ㄨ揪寮忥紝鍒欎骇鐢熶竴涓繍琛屾椂閿欒銆傚璞¤杞崲鎴愬瓧绗︿覆銆傚鏋滃彲鑳斤紝瀛楃涓...
  • js閲岄潰&&杩欎釜琛ㄨ揪寮忔槸浠涔堟剰鎬?
    绛旓細鏂囦欢鐨勪袱涓潯浠讹紙x=锛5鍜岋紱y锛濓紳6锛夛紱//x=锛5锛寉= 6閮芥槸姝g‘鐨勶紝鎵浠ョ粨鏋滄槸鐪熺殑銆傛枃浠讹紙X锛夛紒= 5鍜寉锛6锛夛紱//x锛侊紳5锛寉锛濓紳6 x涓嶇瓑浜5锛岃繖涓潯浠舵槸閿欒鐨勶紝鎵浠ユ暣浣撴槸閿欒鐨勶紝骞朵笖杈撳嚭缁撴灉鏄剧ずFLASH銆<锛佹枃妗g被鍨婬TML> <澶> <鍏冨瓧绗﹂泦=鈥淯TF-8鈥> <鏍囬>杩愮畻绗婕旂ず< />鏍囬>...
  • 扩展阅读:运算符&& ... js正则匹配特殊符号 ... js运算符优先级由高到低 ... 与运算符 ... &符号的含义 ... 位运算符有哪些 ... c++位运算符 ... js特殊符号对照表 ... 位运算符的运算规则python ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网