位运算符要求它的操作数是整数,这些整数表示为32位整型而不是64位浮点型。必要时,位运算符首先将操作数转换为数字,并将数字强制表示为32位整型,这会忽略原格式中的小数部分和任何超过32位的二进制位。移位运算符要求右操作数在0-31之间。在将其操作数转换为无符号32位整数后,它们将舍弃第5位之后的二进制位,以便生成一个位数正确的数字。
我是对:“在将其操作数转换为无符号32位整数后,它们将舍弃第5位后的二进制位,以便生成一个位数正确的数字”这句话理解不了,请大家看一下如何解释
ä¸è¿å
è¦æ¸
æ¥ æ´æ° æ£ è´ äºè¿å¶è¡¨ç¤ºæ¹æ³ æè½ç解 ä½è¿ç®: 请ç
转载:
ECMAScript æ´æ°æ两ç§ç±»åï¼å³æ符å·æ´æ°ï¼å
许ç¨æ£æ°åè´æ°ï¼åæ 符å·æ´æ°ï¼åªå
许ç¨æ£æ°ï¼ãå¨ ECMAScript
ä¸ï¼æææ´æ°åé¢éé»è®¤é½æ¯æ符å·æ´æ°ï¼è¿æå³çä»ä¹å¢ï¼
æ符å·æ´æ°ä½¿ç¨ 31 ä½è¡¨ç¤ºæ´æ°çæ°å¼ï¼ç¨ç¬¬ 32 ä½è¡¨ç¤ºæ´æ°ç符å·ï¼0 表示æ£æ°ï¼1 表示è´æ°ãæ°å¼èå´ä» -2147483648 å°
2147483647ã
å¯ä»¥ä»¥ä¸¤ç§ä¸åçæ¹å¼åå¨äºè¿å¶å½¢å¼çæ符å·æ´æ°ï¼ä¸ç§ç¨äºåå¨æ£æ°ï¼ä¸ç§ç¨äºåå¨è´æ°ãæ£æ°æ¯ä»¥çäºè¿å¶å½¢å¼åå¨çï¼å 31 ä½ä¸çæ¯ä¸ä½é½è¡¨ç¤º 2 çå¹ï¼ä»ç¬¬ 1
ä½ï¼ä½ 0ï¼å¼å§ï¼è¡¨ç¤º 20ï¼ç¬¬ 2 ä½ï¼ä½ 1ï¼è¡¨ç¤º 21ã没ç¨å°çä½ç¨ 0
å¡«å
ï¼å³å¿½ç¥ä¸è®¡ãä¾å¦ï¼ä¸å¾å±ç¤ºçæ¯æ° 18 ç表示æ³ã
18 çäºè¿å¶çæ¬åªç¨äºå 5 ä½ï¼å®ä»¬æ¯è¿ä¸ªæ°åçææä½ãææ°å转æ¢æäºè¿å¶å符串ï¼å°±è½çå°ææä½ï¼
var iNum = 18;è¿æ®µä»£ç åªè¾åº "10010"ï¼èä¸æ¯ 18 ç 32 ä½è¡¨ç¤ºãå ¶ä»çæ°ä½å¹¶ä¸éè¦ï¼å ä¸ºä» ä½¿ç¨å 5 ä½å³å¯ç¡®å®è¿ä¸ªåè¿å¶æ°å¼ãå¦ä¸å¾æ示ï¼
è´æ°ä¹åå¨ä¸ºäºè¿å¶ä»£ç ï¼ä¸è¿éç¨çå½¢å¼æ¯äºè¿å¶è¡¥ç ã计ç®æ°åäºè¿å¶è¡¥ç çæ¥éª¤æä¸æ¥ï¼
ç¡®å®è¯¥æ°åçéè´çæ¬çäºè¿å¶è¡¨ç¤ºï¼ä¾å¦ï¼è¦è®¡ç® -18çäºè¿å¶è¡¥ç ï¼é¦å è¦ç¡®å® 18 çäºè¿å¶è¡¨ç¤ºï¼
æ±å¾äºè¿å¶åç ï¼å³è¦æ 0 æ¿æ¢ä¸º 1ï¼æ 1 æ¿æ¢ä¸º 0
å¨äºè¿å¶åç ä¸å 1
å æ¤ï¼-18 çäºè¿å¶è¡¨ç¤ºå³ 1111 1111 1111 1111 1111 1111 1110 1110ãè®°ä½ï¼å¨å¤çæ符å·æ´æ°æ¶ï¼å¼åè
ä¸è½è®¿é®
31 ä½ã
æ趣çæ¯ï¼æè´æ´æ°è½¬æ¢æäºè¿å¶å符串åï¼ECMAScript
并ä¸ä»¥äºè¿å¶è¡¥ç çå½¢å¼æ¾ç¤ºï¼èæ¯ç¨æ°åç»å¯¹å¼çæ åäºè¿å¶ä»£ç åé¢å è´å·çå½¢å¼è¾åºãä¾å¦ï¼
var iNum = -18;
alert(iNum.toString(2)); //è¾åº "-10010"
è¿æ®µä»£ç è¾åºçæ¯ "-10010"ï¼èéäºè¿å¶è¡¥ç ï¼è¿æ¯ä¸ºé¿å
访é®ä½ 31ã为äºç®ä¾¿ï¼ECMAScript
ç¨ä¸ç§ç®åçæ¹å¼å¤çæ´æ°ï¼ä½¿å¾å¼åè
ä¸å¿
å
³å¿å®ä»¬çç¨æ³ã
å¦ä¸æ¹é¢ï¼æ 符å·æ´æ°ææåä¸ä½ä½ä¸ºå¦ä¸ä¸ªæ°ä½å¤çãå¨è¿ç§æ¨¡å¼ä¸ï¼ç¬¬ 32 ä½ä¸è¡¨ç¤ºæ°åç符å·ï¼èæ¯å¼
231ãç±äºè¿ä¸ªé¢å¤çä½ï¼æ 符å·æ´æ°çæ°å¼èå´ä¸º 0 å° 4294967295ã对äºå°äº 2147483647
çæ´æ°æ¥è¯´ï¼æ 符å·æ´æ°çæ¥ä¸æ符å·æ´æ°ä¸æ ·ï¼èå¤§äº 2147483647 çæ´æ°åè¦ä½¿ç¨ä½ 31ï¼å¨æ符å·æ´æ°ä¸ï¼è¿ä¸ä½æ»æ¯ 0ï¼ã
ææ 符å·æ´æ°è½¬æ¢æå符串åï¼åªè¿åå®ä»¬çææä½ã
注æï¼æææ´æ°åé¢éé½é»è®¤åå¨ä¸ºæ符å·æ´æ°ãåªæ ECMAScript
çä½è¿ç®ç¬¦æè½å建æ 符å·æ´æ°ã
ä½è¿ç® NOT
ä½è¿ç® NOT ç±å¦å®å·ï¼~ï¼è¡¨ç¤ºï¼å®æ¯ ECMAScript ä¸ä¸ºæ°ä¸å¤çä¸äºè¿å¶ç®æ¯æå ³çè¿ç®ç¬¦ä¹ä¸ã
ä½è¿ç® NOT æ¯ä¸æ¥çå¤çè¿ç¨ï¼
æè¿ç®æ°è½¬æ¢æ 32 ä½æ°å
æäºè¿å¶æ°è½¬æ¢æå®çäºè¿å¶åç
æäºè¿å¶æ°è½¬æ¢ææµ®ç¹æ°
ä¾å¦ï¼
var iNum1 = 25;//25 çäº 00000000000000000000000000011001ä½è¿ç® NOT å®è´¨ä¸æ¯å¯¹æ°åæ±è´ï¼ç¶åå 1ï¼å æ¤ 25 å -26ãç¨ä¸é¢çæ¹æ³ä¹å¯ä»¥å¾å°åæ ·çæ¹æ³ï¼
var iNum1 = 25;ä½è¿ç® AND
ä½è¿ç® AND ç±åå·ï¼&ï¼è¡¨ç¤ºï¼ç´æ¥å¯¹æ°åçäºè¿å¶å½¢å¼è¿è¡è¿ç®ãå®ææ¯ä¸ªæ°åä¸çæ°ä½å¯¹é½ï¼ç¶åç¨ä¸é¢çè§å对åä¸ä½ç½®ä¸ç两个æ°ä½è¿è¡ AND
è¿ç®ï¼
第ä¸ä¸ªæ°åä¸çæ°ä½ 第äºä¸ªæ°åä¸çæ°ä½ ç»æ
1
1
1
1
0
0
0
1
0
0
0
0
ä¾å¦ï¼è¦å¯¹æ°å 25 å 3 è¿è¡ AND è¿ç®ï¼ä»£ç å¦ä¸æ示ï¼
var iResult = 25 & 3;25 å 3 è¿è¡ AND è¿ç®çç»ææ¯ 1ã为ä»ä¹ï¼åæå¦ä¸ï¼
25 = 0000 0000 0000 0000 0000 0000 0001 1001å¯ä»¥çåºï¼å¨ 25 å 3 ä¸ï¼åªæä¸ä¸ªæ°ä½ï¼ä½ 0ï¼åæ¾çé½æ¯ 1ï¼å æ¤ï¼å ¶ä»æ°ä½çæçé½æ¯ 0ï¼æ以ç»æ为 1ã
ä½è¿ç® OR
ä½è¿ç® OR ç±ç¬¦å·ï¼|ï¼è¡¨ç¤ºï¼ä¹æ¯ç´æ¥å¯¹æ°åçäºè¿å¶å½¢å¼è¿è¡è¿ç®ãå¨è®¡ç®æ¯ä½æ¶ï¼OR è¿ç®ç¬¦éç¨ä¸åè§åï¼
第ä¸ä¸ªæ°åä¸çæ°ä½ 第äºä¸ªæ°åä¸çæ°ä½ ç»æ
1 1
1
1
0
1
0
1
1
0
0
0
ä»ç¶ä½¿ç¨ AND è¿ç®ç¬¦æç¨çä¾åï¼å¯¹ 25 å 3 è¿è¡ OR è¿ç®ï¼ä»£ç å¦ä¸ï¼
var iResult = 25 | 3;25 å 3 è¿è¡ OR è¿ç®çç»ææ¯ 27ï¼
25 = 0000 0000 0000 0000 0000 0000 0001 1001å¯ä»¥çåºï¼å¨ä¸¤ä¸ªæ°åä¸ï¼å ±æ 4 个æ°ä½åæ¾çæ¯ 1ï¼è¿äºæ°ä½è¢«ä¼ éç»ç»æãäºè¿å¶ä»£ç 11011 çäº 27ã
ä½è¿ç® XOR
ä½è¿ç® XOR ç±ç¬¦å·ï¼^ï¼è¡¨ç¤ºï¼å½ç¶ï¼ä¹æ¯ç´æ¥å¯¹äºè¿å¶å½¢å¼è¿è¡è¿ç®ãXOR ä¸åäº ORï¼å½åªæä¸ä¸ªæ°ä½åæ¾çæ¯ 1 æ¶ï¼å®æè¿å
1ãçå¼è¡¨å¦ä¸ï¼
第ä¸ä¸ªæ°åä¸çæ°ä½ 第äºä¸ªæ°åä¸çæ°ä½ ç»æ
1
1
0
1
0
1
0
1
1
0
0
0
对 25 å 3 è¿è¡ XOR è¿ç®ï¼ä»£ç å¦ä¸ï¼
var iResult = 25 ^ 3;
alert(iResult); //è¾åº "26"
25 å 3 è¿è¡ XOR è¿ç®çç»ææ¯ 26ï¼
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
å¯ä»¥çåºï¼å¨ä¸¤ä¸ªæ°åä¸ï¼å ±æ 4 个æ°ä½åæ¾çæ¯ 1ï¼è¿äºæ°ä½è¢«ä¼ éç»ç»æãäºè¿å¶ä»£ç 11010 çäº 26ã
左移è¿ç®
左移è¿ç®ç±ä¸¤ä¸ªå°äºå·è¡¨ç¤ºï¼<<ï¼ãå®ææ°åä¸çæææ°ä½å左移å¨æå®çæ°éãä¾å¦ï¼ææ°å 2ï¼çäºäºè¿å¶ä¸ç 10ï¼å·¦ç§» 5 ä½ï¼ç»æ为
64ï¼çäºäºè¿å¶ä¸ç 1000000ï¼ï¼
var iOld = 2; //çäºäºè¿å¶ 10
var iNew = iOld << 5; //çäºäºè¿å¶ 1000000 åè¿å¶ 64
注æï¼å¨å·¦ç§»æ°ä½æ¶ï¼æ°åå³è¾¹å¤åº 5 个空ä½ã左移è¿ç®ç¨ 0 å¡«å
è¿äºç©ºä½ï¼ä½¿ç»ææ为å®æ´ç
32 ä½æ°åã
注æï¼å·¦ç§»è¿ç®ä¿çæ°åç符å·ä½ãä¾å¦ï¼å¦ææ -2 左移 5 ä½ï¼å¾å°çæ¯ -64ï¼èä¸æ¯
64ãâ符å·ä»ç¶åå¨å¨ç¬¬ 32 ä½ä¸åï¼âæ¯çï¼ä¸è¿è¿å¨ ECMAScript åå°è¿è¡ï¼å¼åè
ä¸è½ç´æ¥è®¿é®ç¬¬ 32
个æ°ä½ãå³ä½¿è¾åºäºè¿å¶å符串形å¼çè´æ°ï¼æ¾ç¤ºçä¹æ¯è´å·å½¢å¼ï¼ä¾å¦ï¼-2 å°æ¾ç¤º -10ãï¼
æ符å·å³ç§»è¿ç®
æ符å·å³ç§»è¿ç®ç¬¦ç±ä¸¤ä¸ªå¤§äºå·è¡¨ç¤ºï¼>>ï¼ãå®æ 32
ä½æ°åä¸çæææ°ä½æ´ä½å³ç§»ï¼åæ¶ä¿ç该æ°ç符å·ï¼æ£å·æè´å·ï¼ãæ符å·å³ç§»è¿ç®ç¬¦æ°å¥½ä¸å·¦ç§»è¿ç®ç¸åãä¾å¦ï¼æ 64 å³ç§» 5 ä½ï¼å°å为 2ï¼
var iOld = 64; //çäºäºè¿å¶ 1000000
var iNew = iOld >> 5; //çäºäºè¿å¶ 10 åè¿å¶ 2
åæ ·ï¼ç§»å¨æ°ä½åä¼é æ空ä½ãè¿æ¬¡ï¼ç©ºä½ä½äºæ°åç左侧ï¼ä½ä½äºç¬¦å·ä½ä¹åãECMAScript ç¨ç¬¦å·ä½çå¼å¡«å è¿äºç©ºä½ï¼å建å®æ´
æ 符å·å³ç§»è¿ç®
æ 符å·å³ç§»è¿ç®ç¬¦ç±ä¸ä¸ªå¤§äºå·ï¼>>>ï¼è¡¨ç¤ºï¼å®å°æ ç¬¦å· 32
ä½æ°çæææ°ä½æ´ä½å³ç§»ã对äºæ£æ°ï¼æ 符å·å³ç§»è¿ç®çç»æä¸æ符å·å³ç§»è¿ç®ä¸æ ·ã
ç¨æ符å·å³ç§»è¿ç®ä¸çä¾åï¼æ 64 å³ç§» 5 ä½ï¼å°å为 2ï¼
var iOld = 64; //çäºäºè¿å¶ 1000000
var iNew = iOld >>> 5; //çäºäºè¿å¶ 10 åè¿å¶ 2
对äºè´æ°ï¼æ åµå°±ä¸åäºã
æ 符å·å³ç§»è¿ç®ç¨ 0 å¡«å ææ空ä½ã对äºæ£æ°ï¼è¿ä¸æ符å·å³ç§»è¿ç®çæä½ä¸æ ·ï¼èè´æ°å被ä½ä¸ºæ£æ°æ¥å¤çã
ç±äºæ 符å·å³ç§»è¿ç®çç»ææ¯ä¸ä¸ª 32 ä½çæ£æ°ï¼æ以è´æ°çæ 符å·å³ç§»è¿ç®å¾å°çæ»æ¯ä¸ä¸ªé常大çæ°åãä¾å¦ï¼å¦ææ -64 å³ç§» 5 ä½ï¼å°å¾å°
134217726ãå¦ä½å¾å°è¿ç§ç»æçå¢ï¼
è¦å®ç°è¿ä¸ç¹ï¼éè¦æè¿ä¸ªæ°å转æ¢ææ 符å·ççä»·å½¢å¼ï¼å°½ç®¡è¯¥æ°åæ¬èº«è¿æ¯æ符å·çï¼ï¼å¯ä»¥éè¿ä»¥ä¸ä»£ç è·å¾è¿ç§å½¢å¼ï¼
var iUnsigned64 = -64 >>> 0;
ç¶åï¼ç¨ Number ç±»åç toString() è·åå®ççæ£çä½è¡¨ç¤ºï¼éç¨çåºä¸º 2ï¼
alert(iUnsigned64.toString(2));
è¿å°çæ 11111111111111111111111111000000ï¼å³æ符å·æ´æ° -64 çäºè¿å¶è¡¥ç 表示ï¼ä¸è¿å®çäºæ 符å·æ´æ°
4294967232ã
åºäºè¿ç§åå ï¼ä½¿ç¨æ 符å·å³ç§»è¿ç®ç¬¦è¦å°å¿ã