ການດຳເນີນການບຸກລຸກຕາມບາງສະໜາມ ECMAScript
- ຫນ້າຫນັງກ່ອນ ການປະຕິບັດຢູ່ດຽວ
- ຫນ້າຫນັງ ສະມາຊິກການປະຕິບັດ
ສັນຍາການຂັ້ນວິທີແມ່ນການດຳເນີນການພາຍໃຕ້ຕາມບຸກລະບຽບ (ພາຍໃຕ້ການສະແດງຈຳນວນ 32 ຕາມ).
ການສືບຕັ້ງຈຳນວນ
ECMAScript ມີຈຳນວນບຸກລະບຽບສອງຊະນິດ, ເຊິ່ງແມ່ນຈຳນວນບຸກລະບຽບ (ອະນຸຍາດໃຊ້ຈຳນວນທີ່ບັນລຸ ແລະຈຳນວນທີ່ບັນລຸ) ແລະຈຳນວນບຸກລະບຽບ (ອະນຸຍາດໃຊ້ຈຳນວນທີ່ບັນລຸ). ໃນ ECMAScript, ຈຳນວນທີ່ບັນລຸທັງໝົດແມ່ນຈຳນວນບຸກລະບຽບ, ແຕ່ຫຍັງຈະແມ່ນຫຍັງ?
ຈຳນວນບຸກລະບຽບໃຊ້ 31 ຕາມກ່ອນບັນຄັບຈຳນວນ, ແລະຕໍ່ມາກໍ່ແມ່ນຕາມກ່ອນບັນຄັບບຸກລະບຽບ, 0 ບັນດາຈຳນວນບັນລຸ, 1 ບຸກລະບຽບ. ຂອບເຂດຈຳນວນຈະຢູ່ຈາກ -2147483648 ຫາ 2147483647.
ຈຳນວນບຸກລະບຽບມີສອງວິທີການບັນຄັບບຸກລະບຽບ, ໜຶ່ງວິທີການບັນຄັບຈຳນວນທີ່ບັນລຸ ແລະວິທີການບັນຄັບຈຳນວນທີ່ບັນລຸ. ຈຳນວນທີ່ບັນລຸແມ່ນບຸກລະບຽບຄວາມຈະນັດ, ແລະຕໍ່ມາກໍ່ແມ່ນບຸກລະບຽບບັນລຸ. ແຕ່ຫຍັງຈະແມ່ນຫຍັງ?0ບັນດາຕາມທີ 2 (ຕາມ 1) ສະແດງ 21ບັນດາຕາມທີ່ບໍ່ໃຊ້ຈະຖືກບອກດ້ວຍ 0, ແລະບໍ່ມີຄວາມສຳຄັນ. ເອງນີ້ສະແດງຄວາມສະແດງຈຳນວນ 18:

ຄວາມສະແດງຂອງ 18 ໃນຮູບແບບບຸກລະບຽບພຽງແຕ່ຕ້ອງນໍາໃຊ້ 5 ຕາມກ່ອນ ເຊິ່ງເປັນຕາມຂອງຈຳນວນດັ່ງກ່າວ. ຖ້າປ່ຽນຈຳນວນໃຫ້ເປັນຄວາມສະແດງບຸກລະບຽບ ຈະເຫັນຕາມກ່ອນ:
var iNum = 18; alert(iNum.toString(2)); //ບອກ "10010"
ກິດຈະກຳດັ່ງກ່າວພຽງແຕ່ບອກ "10010" ບໍ່ແມ່ນຄວາມສະແດງ 32 ຕາມຂອງ 18. ບັນດາຕາມບໍ່ມີຄວາມສຳຄັນ ຍ້ອນພຽງແຕ່ຕ້ອງນໍາໃຊ້ 5 ຕາມກ່ອນເພື່ອສຳຫຼວດຄວາມສະແດງສະເຫຼີມນີ້. ສະແດງດັ່ງກ່າວນີ້:

负数也存储为二进制代码,不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步:
- 确定该数字的非负版本的二进制表示(例如,要计算 -18的二进制补码,首先要确定 18 的二进制表示)
- 求得二进制反码,即要把 0 替换为 1,把 1 替换为 0
- 在二进制反码上加 1
要确定 -18 的二进制表示,首先必须得到 18 的二进制表示,如下所示:
0000 0000 0000 0000 0000 0000 0001 0010
接下来,计算二进制反码,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101
最后,在二进制反码上加 1,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101 1 --------------------------------------- 1111 1111 1111 1111 1111 1111 1110 1110
ດັ່ງນັ້ນ, ຄຳສະຍາການສອງສິບລັດທະບັດຂອງ -18 ຈະເປັນ 1111 1111 1111 1111 1111 1111 1110 1110. ເຂົ້າເຄີຍກັບ, ໃນການຄວາມສຳຄັນຂອງຄຳສັບສິບມີສິນຄ່າ, ນັກພັດທະນາຈະບໍ່ສາມາດເຂົ້າເຖິງຈຸດ 31.
ຄວາມສົມດັນຢູ່ວ່າ, ການປ່ຽນຄຳສັບສິບທີ່ບໍ່ມີສິນຄ່າເປັນຄຳສະຍາການສອງສິບລັດທະບັດ, ECMAScript ຈະບໍ່ສະແດງເປັນຄຳສະຍາການຂອງບົດສະຍາການສອງສິບລັດທະບັດຄຳສະຍາການ, ແຕ່ທັງສະຍາການສະນວນຂອງຄຳສະຍາການສະຫຼຸບທີ່ມີຄວາມສຳຄັນກ່ອນຫຼັງຂອງອີກວຽນ. ເວົ້າຕອນນັ້ນ:
var iNum = -18; alert(iNum.toString(2)); //ອອກ "-10010"
ວິດີຂອງຄຳສະຍາການນັ້ນອອກຄື "-10010", ບໍ່ແມ່ນຄຳສະຍາການຂອງບົດສະຍາການສອງສິບລັດທະບັດ, ເພື່ອຫຼີກລ່ວງການເຂົ້າເຖິງຈຸດ 31. ເພື່ອຫຼີກຫຼາຍ, ECMAScript ຈະນຳໃຊ້ຮູບແບບທີ່ງ່າຍດາຍໃນການຄວາມສຳຄັນ, ເພື່ອຫຼີກລ່ວງການເຂົ້າເຖິງການນຳໃຊ້ຂອງພວກມັນ.
ຕອນກັນ, ຄຳສັບສິບທີ່ບໍ່ມີສິນຄ່າຈະນຳໃຊ້ຈຸດສຸດທ້າຍເປັນຈຸດສະຍາການອື່ນໆ. ໃນຮູບແບບນັ້ນ, ຈຸດ 32 ບໍ່ເປັນຈຸດສະຍາການສະນັບສະນວນຂອງຄຳສະຍາການ, ແຕ່ມີຄວາມມູນ 2.31ເນື່ອງຈາກວຽນດັ່ງກ່າວ, ຄຳສັບສິບທີ່ບໍ່ມີສິນຄ່າຈະມີຄວາມລະດັບຂອງຈາກ 0 ຫາ 4294967295. ສຳລັບຄຳສັບສິບທີ່ຍັງມີຈຸດສະຍາດຍັງມີຫຼາຍຫຼາຍຫຼັງ 2147483647, ຄຳສັບສິບທີ່ບໍ່ມີສິນຄ່າຈະເບິ່ງຄືກັບຄຳສັບສິບມີສິນຄ່າ, ແຕ່ຫຼາຍຫຼາຍຫຼັງ 2147483647 ຈະຕ້ອງໃຊ້ຈຸດ 31 (ໃນຄຳສັບສິບມີສິນຄ່າ, ຈຸດນັ້ນຈະຕ້ອງເປັນ 0).
ຫຼັງຈາກການປ່ຽນຄຳສັບສິບທີ່ບໍ່ມີສິນຄ່າເປັນຄຳສະຍາການ, ຈະກັບຄືນພຽງແຕ່ບົດສະຍາການບົດສະຍາການທີ່ມີຄວາມສຳຄັນ.
ຄວາມຕ້ອງເຫັນ:ທຸກຄຳສັບສິບທີ່ສະແດງໂດຍກົດສະຫຼຸບຈະຖືກຮັກສາເປັນຄຳສັບສິບມີສິນຄ່າ. ພຽງແຕ່ການຄັດລະບາຍບົດສະຍາການບົດສະຍາການບົດສະຍາການ NOT ECMAScript ຈະສາມາດສ້າງຄຳສັບສິບທີ່ບໍ່ມີສິນຄ່າ.
ການຄັດລະບາຍບົດສະຍາການ NOT
ການຄັດລະບາຍບົດສະຍາການ NOT ສະແດງໂດຍອີກວຽນ ( ~ ) ມັນເປັນລະບົບ ECMAScript ທີ່ມີຫຼາຍການຄັດລະບາຍທາງບົດສະຍາການທີ່ກ່ຽວກັບທາງບັນນາທິການສອງສິບລັດທະບັດຫຼາຍຫຼາຍຫຼັງ.
位运算 NOT 是三步的处理过程:
- 把运算数转换成 32 位数字
- 把二进制数转换成它的二进制反码
- 把二进制数转换成浮点数
例如:
var iNum1 = 25; //25 等于 00000000000000000000000000011001 var iNum2 = ~iNum1; //转换为 11111111111111111111111111100110 alert(iNum2); //输出 "-26"
位运算 NOT 实质上是对数字求负,然后减 1,因此 25 变 -26。用下面的方法也可以得到同样的方法:
var iNum1 = 25; var iNum2 = -iNum1 -1; alert(iNum2); //输出 -26
位运算 AND
位运算 AND 由和号(&)表示,直接对数字的二进制形式进行运算。它把每个数字中的数位对齐,然后用下面的规则对同一位置上的两个数位进行 AND 运算:
ວິທີຂອງຈຳນວນທີໜຶ່ງ | ວິທີຂອງຈຳນວນທີສອງ | ຜົນ |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
例如,要对数字 25 和 3 进行 AND 运算,代码如下所示:
var iResult = 25 & 3; alert(iResult); //输出 "1"
25 和 3 进行 AND 运算的结果是 1。为什么?分析如下:
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
可以看出,在 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; alert(iResult); //ການສົ່ງອອກ "27"
25 ແລະ 3 ການດຳເນີນ OR ມີຜົນຕາຍເປັນ 27:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 -------------------------------------------- OR = 0000 0000 0000 0000 0000 0000 0001 1011
ສາມາດເຫັນໄດ້ວ່າໃນສອງເລກຂອງພວກເຂົາມີ 4 ຕົວເລກທີ່ຕັ້ງເປັນ 1 ພວກມັນຖືກສົ່ງໄປຫາຜົນຕາຍ. ວັດຖຸເບີຍິນ 11011 ວ່າ 27.
ການປະຕິບັດວິທີ XOR
ການປະຕິບັດວິທີ XOR ຈະສະແດງໂດຍສິ່ງ (^), ຕໍ່ຕ້ອງ, ຈະປະຕິບັດຢູ່ວິທິສອງວິທີ. XOR ຕ່າງຈາກ OR, ຈະກັບຄວາມ 1 ພຽງໜຶ່ງວິທີ, ຈະກັບຄວາມ 1. ການປະຕິບັດຕາມການສະແດງຢູ່ດັ່ງກ່າວ:
ວິທີຂອງຈຳນວນທີໜຶ່ງ | ວິທີຂອງຈຳນວນທີສອງ | ຜົນ |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
ການປະຕິບັດ XOR ລະຫວ່າງ 25 ແລະ 3, ວິທີງານພາຍໃນກໍານົດງານວ່າ:
var iResult = 25 ^ 3; alert(iResult); //ອອກສຽງ "26"
ຜົນການປະຕິບັດ XOR ລະຫວ່າງ 25 ແລະ 3 ຈະເປັນ 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 填充所有空位。对于正数,这与有符号右移运算的操作一样,而负数则被作为正数来处理。
ຜົນຂອງການປະຕິບັດອອກມາຂອງການປະຕິບັດອອກມາທີ່ບໍ່ມີຄວາມລັບແມ່ນຈະເປັນເປັນອັດຕາສະເຫຼີມທີ່ສູງຫລາຍ, ຄວາມສຳລັບການປະຕິບັດອອກມາທີ່ມີຄວາມລັບຂອງຈະເປັນອັດຕາສະເຫຼີມທີ່ສູງຫລາຍ. ເອງນັ້ນ, ຖ້າມີ -64 ທີ່ປະຕິບັດອອກມາ 5 ວັນ, ຈະໄດ້ມີ 134217726. ວິທະຍາສາດທີ່ຈະມາຈາກນັ້ນແນວໃດ?
ເພື່ອຈະພິສູດນັ້ນ, ຕ້ອງໄດ້ປ່ຽນແປງເປັນຮູບແບບອັດຕາສະເຫຼີມບໍ່ມີຄວາມລັບ (ເຖິງວ່າຈະຢູ່ໃນປະເພດທີ່ມີຄວາມລັບ), ທີ່ສາມາດຊອກຮູບແບບນັ້ນວ່າ:
var iUnsigned64 = -64 >>> 0;
ຫນັງຈາກນັ້ນ, ທີ່ຈະຮັບຮູບຈຳນວນພາສາຈີສະເຕັກນິກຢ່າງແທ້ຈິງຈາກປະເພດ Number, ທີ່ໃຊ້ພື້ນຖານ 2:
alert(iUnsigned64.toString(2));
ຈະກາຍເປັນ 11111111111111111111111111000000, ສະຫຼຸບສະເຫຼີມຂອງອັດຕາສະເຫຼີມ -64 ທາງວິທະຍາສາດວິທະນະທຳ, ແຕ່ມັນຮອດອັດຕາສະເຫຼີມ 4294967232 ທາງອັດຕາສະເຫຼີມບໍ່ມີຄວາມລັບ.
ສຳລັບເຫດນັ້ນຫນັງການນໍາໃຊ້ການປະຕິບັດອອກມາທີ່ບໍ່ມີຄວາມລັບ
- ຫນ້າຫນັງກ່ອນ ການປະຕິບັດຢູ່ດຽວ
- ຫນ້າຫນັງ ສະມາຊິກການປະຕິບັດ