å³ç§»ï¼>>ï¼
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
å³ç§»è¿ç®ç¬¦ï¼>>ï¼å°ä¸ä¸ªæä½æ°çäºè¿å¶è¡¨ç¤ºå½¢å¼åå³ç§»å¨æå®ä½æ°ï¼è¯¥æä½æ°å¯ä»¥æ¯æ°å¼æè
BigInt ç±»åãå³è¾¹ç§»åºä½è¢«ä¸¢å¼ï¼å·¦è¾¹ç§»åºç空ä½è¡¥ç¬¦å·ä½ï¼æå·¦è¾¹é£ä½ï¼ã该æä½ä¹ç§°ä¸ºâ符å·ä½ä¼ æå³ç§»âï¼sign-propagating right shiftï¼æâç®æ¯å³ç§»âï¼arithmetic right shiftï¼ï¼å 为è¿åå¼ç符å·ä½ä¸ç¬¬ä¸ä¸ªæä½æ°ç符å·ä½ç¸åã
å°è¯ä¸ä¸
const a = 5; // 00000000000000000000000000000101
const b = 2; // 00000000000000000000000000000010
const c = -5; // 11111111111111111111111111111011
console.log(a >> b); // 00000000000000000000000000000001
// Expected output: 1
console.log(c >> b); // 11111111111111111111111111111110
// Expected output: -2
è¯æ³
x >> y
æè¿°
>> è¿ç®ç¬¦é对è¿ä¸¤ç§æä½æ°çç±»åè¿è¡äºéè½½ï¼æ°å¼å BigIntãå¯¹äºæ°å¼ï¼è¯¥è¿ç®ç¬¦è¿åä¸ä¸ª 32 使´æ°ï¼å¯¹äº BigInt ç±»åï¼è¯¥è¿ç®ç¬¦è¿åä¸ä¸ª BigIntãå³ç§»è¿ç®ç¬¦é¦å
å°ä¸¤ä¸ªæä½æ°å¼ºå¶è½¬æ¢ä¸ºæ°å¼å¹¶æµè¯å®ä»¬çç±»åãå¦æä¸¤ä¸ªæä½æ°é½è½¬æ¢æ BigIntï¼åæ§è¡ BigInt å³ç§»ï¼å¦åï¼å®å°ä¸¤ä¸ªæä½æ°é½è½¬æ¢ä¸º 32 使´æ°å¹¶æ§è¡æ°å¼å³ç§»ã妿ä¸ä¸ªæä½æ°å为 BigInt èå¦ä¸ä¸ªå为æ°å¼ï¼åä¼æåº TypeErrorã
ç±äºæ°çæ°åæå·¦è¾¹ä½ä¸ä¹åæ°åçæå·¦è¾¹ä½æ¯ç¸åå¼ï¼æ 符å·ä½ï¼æå·¦è¾¹çä½ï¼ä¸ä¼æ¹åï¼å æ¤è¢«ç§°ä¸ºâ符å·ä½ä¼ æâï¼sign-propagatingï¼ã
è¿ç®ç¬¦ä»¥äºè¿å¶è¡¥ç çå½¢å¼å¯¹å·¦æä½æ°è¿è¡è¿ç®ãèèåè¿å¶ï¼ä»¥ 10 为åºï¼æ°å 9 å -9 ç 32 ä½äºè¿å¶è¡¨ç¤ºï¼
9 (åè¿å¶): 00000000000000000000000000001001 (äºè¿å¶)
-9 (åè¿å¶): 11111111111111111111111111110111 (äºè¿å¶)
åè¿å¶ï¼ä»¥ 10 为åºï¼è´æ° -9 çäºè¿å¶è¡¥ç 表示æ¯å°å
¶ç¸åæ°ï¼å³ 9ï¼çäºè¿å¶è¡¨ç¤º 00000000000000000000000000001001 çææä½ååï¼åå 1ã
è¿ä¸¤ä¸ªæ°çäºè¿å¶è¡¨ç¤ºç符å·ä½ç±å
¶æå·¦è¾¹çä½å³å®ï¼å¯¹äºåè¿å¶æ£æ° 9ï¼äºè¿å¶è¡¨ç¤ºçæå·¦è¾¹ä½ä¸º 0ï¼å¯¹äºåè¿å¶è´æ° -9ï¼äºè¿å¶è¡¨ç¤ºçæå·¦è¾¹ä½æ¯ 1ã
ç»å®åè¿å¶ï¼ä»¥ 10 为åºï¼æ° 9 å -9 çäºè¿å¶è¡¨ç¤ºï¼
9 >> 2 å¾å° 2ï¼
9 (åè¿å¶): 00000000000000000000000000001001 (äºè¿å¶)
--------------------------------
9 >> 2 (åè¿å¶): 00000000000000000000000000000010 (äºè¿å¶) = 2 (åè¿å¶)
请注ææå³è¾¹ç 01 æ¯å¦ä½ç§»åºçï¼æå·¦è¾¹ç 00 æ¯å¦ä½ä»å·¦è¾¹ç§»å
¥çã
-9 >> 2 å¾å° -3ï¼
-9 (åè¿å¶): 11111111111111111111111111110111 (äºè¿å¶)
--------------------------------
-9 >> 2 (åè¿å¶): 11111111111111111111111111111101 (äºè¿å¶) = -3 (åè¿å¶)
请注ææå³è¾¹ç 11 æ¯å¦ä½ç§»åºçãä½æå·¦è¾¹ç使
åµç¨æä¸åï¼ç±äº -9 æ¯è´æ°ï¼å®ç符å·ä½ï¼å³æå·¦è¾¹çä½ï¼æ¯ 1ï¼å æ¤å³ç§» 2 使¶ä¼å¨æå·¦è¾¹è¡¥ä¸ 11ï¼è¿ä¾¿ä¿çäºè´å·ã
äºè¿å¶è¡¨ç¤º 11111111111111111111111111111101 çäºåè¿å¶ï¼ä»¥ 10 为åºï¼è´æ° -3ï¼å 为ææè´æ´æ°é½ä»¥äºè¿å¶è¡¥ç çå½¢å¼åå¨ï¼è -3 çäºè¿å¶è¡¥ç å¯ä»¥éè¿å°åè¿å¶ï¼ä»¥ 10 为åºï¼æ£æ° 3 çäºè¿å¶è¡¨ç¤ºï¼å³ 00000000000000000000000000000011ï¼çææä½å
ååï¼ç¶åå 1ã
妿左æä½æ°æ¯ä¸ä¸ªè¶ è¿ 32 ä½çæ°åï¼åä¼ä¸¢å¼æé«ææä½ãä¾å¦ï¼ä»¥ä¸è¶ è¿ 32 ä½çæ´æ°å°è¢«è½¬æ¢ä¸º 32 使´æ°ï¼
丢å¼åï¼11100110111110100000000000000110000000000001 丢å¼åï¼ 10100000000000000110000000000001
峿使°å°è¢«è½¬æ¢ä¸ºæ ç¬¦å· 32 使´æ°ï¼ç¶å忍¡ 32ï¼å æ¤å®é
ç§»ä½åç§»éå°å§ç»æ¯ 0 å° 31 ä¹é´çæ£æ´æ°ï¼å
æ¬ 0 å 31ãä¾å¦ï¼100 >> 32 ä¸ 100 >> 0 ç¸åï¼ç»æé½æ¯ 100ï¼ï¼å 为 32 模 32 为 0ã
BigInt å¨ä½¿ç¨å³ç§»æ¶ä¸ä¼äº§çæªæç°è±¡ã仿¦å¿µä¸è®²ï¼æ£ BigInt å
·ææ éæ°éçåå¯¼ä½ 0ï¼èè´ BigInt å
·ææ éæ°éçåå¯¼ä½ 1ã
å°ä»»ä½æ°å x å³ç§» 0 å¯ä»¥å° x 转æ¢ä¸º 32 使´æ°ãä¸è¦ä½¿ç¨ >> 0 å°æ°åæªæä¸ºæ´æ°ï¼ä½¿ç¨ Math.trunc() 代æ¿ã
示ä¾
>使ç¨å³ç§»æä½
9 >> 2; // 2
-9 >> 2; // -3
9n >> 2n; // 2n
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-signed-right-shift-operator> |