ການດຳເນີນການບຸກລຸກຕາມບາງສະໜາມ ECMAScript

ສັນຍາການຂັ້ນວິທີແມ່ນການດຳເນີນການພາຍໃຕ້ຕາມບຸກລະບຽບ (ພາຍໃຕ້ການສະແດງຈຳນວນ 32 ຕາມ).

ການສືບຕັ້ງຈຳນວນ

ECMAScript ມີຈຳນວນບຸກລະບຽບສອງຊະນິດ, ເຊິ່ງແມ່ນຈຳນວນບຸກລະບຽບ (ອະນຸຍາດໃຊ້ຈຳນວນທີ່ບັນລຸ ແລະຈຳນວນທີ່ບັນລຸ) ແລະຈຳນວນບຸກລະບຽບ (ອະນຸຍາດໃຊ້ຈຳນວນທີ່ບັນລຸ). ໃນ ECMAScript, ຈຳນວນທີ່ບັນລຸທັງໝົດແມ່ນຈຳນວນບຸກລະບຽບ, ແຕ່ຫຍັງຈະແມ່ນຫຍັງ?

ຈຳນວນບຸກລະບຽບໃຊ້ 31 ຕາມກ່ອນບັນຄັບຈຳນວນ, ແລະຕໍ່ມາກໍ່ແມ່ນຕາມກ່ອນບັນຄັບບຸກລະບຽບ, 0 ບັນດາຈຳນວນບັນລຸ, 1 ບຸກລະບຽບ. ຂອບເຂດຈຳນວນຈະຢູ່ຈາກ -2147483648 ຫາ 2147483647.

ຈຳນວນບຸກລະບຽບມີສອງວິທີການບັນຄັບບຸກລະບຽບ, ໜຶ່ງວິທີການບັນຄັບຈຳນວນທີ່ບັນລຸ ແລະວິທີການບັນຄັບຈຳນວນທີ່ບັນລຸ. ຈຳນວນທີ່ບັນລຸແມ່ນບຸກລະບຽບຄວາມຈະນັດ, ແລະຕໍ່ມາກໍ່ແມ່ນບຸກລະບຽບບັນລຸ. ແຕ່ຫຍັງຈະແມ່ນຫຍັງ?0ບັນດາຕາມທີ 2 (ຕາມ 1) ສະແດງ 21ບັນດາຕາມທີ່ບໍ່ໃຊ້ຈະຖືກບອກດ້ວຍ 0, ແລະບໍ່ມີຄວາມສຳຄັນ. ເອງນີ້ສະແດງຄວາມສະແດງຈຳນວນ 18:

ຈຳນວນ 32 ບັນນາທິດບິນສະແດງຈຳນວນສັນຍາວະ

ຄວາມສະແດງຂອງ 18 ໃນຮູບແບບບຸກລະບຽບພຽງແຕ່ຕ້ອງນໍາໃຊ້ 5 ຕາມກ່ອນ ເຊິ່ງເປັນຕາມຂອງຈຳນວນດັ່ງກ່າວ. ຖ້າປ່ຽນຈຳນວນໃຫ້ເປັນຄວາມສະແດງບຸກລະບຽບ ຈະເຫັນຕາມກ່ອນ:

var iNum = 18;
alert(iNum.toString(2));	//ບອກ "10010"

ກິດຈະກຳດັ່ງກ່າວພຽງແຕ່ບອກ "10010" ບໍ່ແມ່ນຄວາມສະແດງ 32 ຕາມຂອງ 18. ບັນດາຕາມບໍ່ມີຄວາມສຳຄັນ ຍ້ອນພຽງແຕ່ຕ້ອງນໍາໃຊ້ 5 ຕາມກ່ອນເພື່ອສຳຫຼວດຄວາມສະແດງສະເຫຼີມນີ້. ສະແດງດັ່ງກ່າວນີ້:

ຈຳນວນ 5 ບັນນາທິດບິນສະແດງ 18

负数也存储为二进制代码,不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步:

  1. 确定该数字的非负版本的二进制表示(例如,要计算 -18的二进制补码,首先要确定 18 的二进制表示)
  2. 求得二进制反码,即要把 0 替换为 1,把 1 替换为 0
  3. 在二进制反码上加 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 是三步的处理过程:

  1. 把运算数转换成 32 位数字
  2. 把二进制数转换成它的二进制反码
  3. 把二进制数转换成浮点数

例如:

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 ການຍ້າຍຂັ້ນຊ້າຍ

ຄວາມຕ້ອງເຫັນ:ການຍ້າຍຊ້າຍຈະກັບຄວາມສະຫຼາດຂອງຈຳນວນ. ໂດຍການຍ້າຍ -2 ຊ້າຍ 5 ວິທີ, ຈະມີ -64, ບໍ່ແມ່ນ 64. “ຄວາມສະຫຼາດຈະຕັ້ງຢູ່ໃນວິທີທີ 32 ຫຼືບໍ່?” ແມ່ນ, ແຕ່ນັ້ນຈະປະຕິບັດຢູ່ບໍລິຫານ ECMAScript, ຜູ້ພັດທະນາບໍ່ສາມາດເຂົ້າເຖິງວິທີທີ 32. ເຖິງວ່າຈະອອກສຽງວິທິຈາກຮູບແບບວິທິສອງວິທີ, ຈະສະແດງຄວາມສະຫຼາດຫຼື (例如,-2 ຈະສະແດງ -10.)

ຄູ່ມິຕິທີ່ຫັນກັບການຍ້າຍຊ້າຍ

ຄູ່ມິຕິທີ່ຫັນກັບການຍ້າຍຊ້າຍວິທີຈາກສອງການຍົກຍ້າຍຫັງ (>>). ມັນຈະຍ້າຍຊ້າຍທຸກຕົວເລກ 32 ວິທີທັງໝົດ, ແລະກັບຄວາມສະຫຼາດ (ສຽງສະເຫຼ່ຍຫຼືສຽງຕົກ). ຄູ່ມິຕິທີ່ຫັນກັບການຍ້າຍຊ້າຍຫັງກັນກັບການຍ້າຍຊ້າຍຂອງ. ໂດຍການຍ້າຍ 64 ຊ້າຍ 5 ວິທີ, ຈະກາຍເປັນ 2:

var iOld = 64;		//等于二进制 1000000
var iNew = iOld >> 5;	//等于二进制 10 十进制 2

同样,移动数位后会造成空位。这次,空位位于数字的左侧,但位于符号位之后。ECMAScript 用符号位的值填充这些空位,创建完整的数字,如下图所示:

ຈຳນວນ 64 ການຍ້າຍຂັ້ນຊ້າຍສັນຍາວະ

无符号右移运算

无符号右移运算符由三个大于号(>>>)表示,它将无符号 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 ທາງອັດຕາສະເຫຼີມບໍ່ມີຄວາມລັບ.

ສຳລັບເຫດນັ້ນຫນັງການນໍາໃຊ້ການປະຕິບັດອອກມາທີ່ບໍ່ມີຄວາມລັບ