عملگرهای بیت‌ساز ECMAScript

位运算符是在数字底层(即表示数字的 32 个数位)进行操作的。

重温整数

ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢?

有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围从 -2147483648 到 2147483647。

可以以两种不同的方式存储二进制形式的有符号整数,一种用于存储正数,一种用于存储负数。正数是以真二进制形式存储的,前 31 位中的每一位都表示 2 的幂,从第 1 位(位 0)开始,表示 20,第 2 位(位 1)表示 21。没用到的位用 0 填充,即忽略不计。例如,下图展示的是数 18 的表示法。

32 بیتی نمودار باینری با علامت مثبت

18 的二进制版本只用了前 5 位,它们是这个数字的有效位。把数字转换成二进制字符串,就能看到有效位:

var iNum = 18;
alert(iNum.toString(2));	//输出 "10010"

这段代码只输出 "10010",而不是 18 的 32 位表示。其他的数位并不重要,因为仅使用前 5 位即可确定这个十进制数值。如下图所示:

عدد 18 با 5 بیتی باینری

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

  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 تک رسائی کا استعمال کریگا جاچکا ہوتا ہے۔ تاوان سے، ایکم اسکریپت کا سادا طریقہ استعمال کرتا ہے جس سے مخترعین کو ان کی استعمال کو ناچھوئی نات چوئی کریگا جاچکا ہوتا ہے۔

دوسری جانب، ناچھوئی چجلی سگن چجلی کا آخری بائت کو دوسری چجلی کا استعمال کرتا ہے۔ اس ماڈ کے اندر، 32 واں بائت ناچھوئی چجلی کا سوال ناچھوئی چجلی کا سوال ناچھوئی نات چوئی کریگا جاچکا ہوتا ہے، ناچھوئی چجلی کا سوال 2 کا سوال چوئی کریگا جاچکا ہوتا ہے۔31اس اضافی بائت کی وجہ سے ناچھوئی چجلی سگن چجلی کا سوال 0 سے 4294967295 تک کا ہوتا ہے۔ 2147483647 سے کم کے پورا عدد کا سوال ناچھوئی چجلی سگن چجلی کا سوال چوئی کریگا جاچکا ہوتا ہے جیسا کہ پورا عدد کا سوال چوئی کریگا جاچکا ہوتا ہے، لیکن 2147483647 سے زیادہ کا پورا عدد کا سوال بائت 31 (پورا عدد میں یہ بائت ہمیشہ 0 کا سوال چوئی کریگا جاچکا ہوتا ہے) کا استعمال کرنا چاہئے۔

ناچھوئی چجلی سگن چجلی نات سیکسٹن بائت چجلی ناچھوئی نات چوئی کریگا جاچکا ہوتا ہے۔

توجہ:تمام پورا عددی دوسرواژداشتی کچھ ناچھوئی کا سوال نات سگن چجلی جاچکا ہوتا ہے۔ صرف ایکم اسکریپت کے بائت آپریشن آئیچی سگن چجلی نات چوئی کریگا جاچکا ہوتا ہے۔

بائت آپریشن نات

بائت آپریشن نات (NOT) کا نمائش ناقص کے علامت (~) سے کیا جاتا ہے، یہ ایکم اسکریپت میں بائنری ریاضیات سے متعلق کچھ نایاب آپریشن میں سے ایک ہے۔

بائنری آپریشن 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 کو وائس آئیکون (&) سے نمائش دیا جاتا ہے، یہ براہ راست نمبر کی بائنری شکل پر آپریشن کرتا ہے۔ یہ ہر نمبر کی شمار کا مقام کو منظم کرتا ہے، پھر درج ذیل اصول کو استعمال کرتا ہے:

پہلے نمبر کی اعداد کی جگہیں دوسرے نمبر کی اعداد کی جگہیں نتائج
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

یہی مثال کا استعمال اندرکار آند آپریشن پر آپریشن کا کوڈ درج ذیل ہے:

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

برای 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 با عملیات چپ حرکت

توجہ:چوئن مونٹریج کاراکٹر کا کام نمبر کا نشان رکھنا ہوتا ہے. مثال میں، اگر -2 کو 5 چوئن مونٹریج کیا جائے تو اس کا نتیجہ -64 ہوگا، نہ کہ 64. “نشان کا نشان رکھنا کا کام کیوں کچھ 32ویں بیتی میں ہوتا ہے؟” نا، لیکن یہ ECMAScript کی باطنی عمل میں ہوتا ہے، اور پروگرامر اس کی 32ویں بیتی تک براہ راست رسائی نہیں کرسکتا. چنانچہ منفی نمبر کی بائنری سٹرنگ شکل میں نمائش کی جائے تو اس میں منفی نشان بھی نمائش کیاجائے گا (مثال میں، -2 کو -10 کی شکل میں نمائش کیاجائے گا).

سائمی چوئن مونٹریج

سائمی چوئن مونٹریج کاراکٹر سے نمائش کی جاتی ہیں (>>). وہ 32 بیتی نمبر کی سبھی اعداد کو ایک ساتھ دائیجان بھیج دیتا ہے، اور اس نمبر کا نشان رکھتا ہے (پزیر یا منفی نشان). سائمی چوئن مونٹریج کاراکٹر کا کام چوئن مونٹریج کاراکٹر سے برعکس ہوتا ہے. مثال میں، 64 کو 5 چوئن مونٹریج کیا جائے تو اس کا نتیجہ 2 بن جائے گا:

وارن آئی اولڈ = 64; // بیاینری 1000000
وارن آئی نیو = آئی اولڈ >> 5; // بیاینری 10 دسیمال 2

اسی طرح، بیٹ کو کوریئر کردے وقت خالی جگہوں میں آجائیں گے۔ اس بار، خالی جگہوں کو نمبر کی چہرے کے پاس سمت میں اور نمائش کی جگہ کے بعد میں آجائیں گے۔ ECMAScript یہ خالی جگہوں کو نمائش کی جگہ کی اقدار کے ذریعے بند کر دیتی ہے، تاکہ پورا نمبر بنایا جائے، جیسا کہ تصویر میں دیا گیا ہے:

عدد 64 با عملیات چپ حرکت با علامت

بائیں سمت میں مشتق کردہ آپریٹر

بائیں سمت میں مشتق کردہ آپریٹر تین سے بائیں سمت میں بول (>>> ) سے نمائش کی جاتی ہے، یہ غیر منفی 32 بیٹ نمبر کی تمام بیٹ کو کوریئر کردیگا۔ مثبت نمبر کے لئے، بائیں سمت میں مشتق کردہ آپریٹر کا نتیجہ منفی نمبر کا بائیں سمت میں مشتق کردہ آپریٹر کا نتیجہ سے برابر ہوتا ہے۔

بیاینری میں مشتق کردہ آپریٹر کا مثال میں، اگر 64 کو 5 بیٹ بائیں سمت میں مشتق کردہ آپریٹر کا استعمال کیا جائے تو 2 بنایا جائے گا:

وارن آئی اولڈ = 64; // بیاینری 1000000
وارن آئی نیو = آئی اولڈ >>> 5; // بیاینری 10 دسیمال 2

منفی نمبر کے لئے، حالت مختلف ہوتی ہے۔

بائیں سمت میں مشتق کردہ آؤٹ پلائسمنٹ آپریٹر میں 0 سے تمام خالی جگہوں کو بند کر دیا جاتا ہے۔ مثبت نمبر کے لئے، یہ عمل منفی نمبر کا بائیں سمت میں مشتق کردہ آؤٹ پلائسمنٹ آپریٹر کے عمل سے برابر ہوتا ہے، جبکہ منفی نمبر کا لئے اس کا بائیں سمت میں مشتق کردہ آپریٹر منفی نمبر کو مثبت نمبر کی طرح بند کر دیا جاتا ہے۔

بائیں سمت میں مشتق کردہ آؤٹ پلائسمنٹ آپریٹر کا نتیجہ 32 بیٹ کا مثبت عدد ہوتا ہے، لہذا منفی نمبر کا بائیں سمت میں مشتق کردہ آؤٹ پلائسمنٹ آپریٹر کا نتیجہ کوئی بہت بڑا نمبر بنایا جاتا ہے۔ مثال کے لئے، اگر -64 کو 5 بیٹ بائیں سمت میں مشتق کردہ آؤٹ پلائسمنٹ آپریٹر کا استعمال کیا جائے تو 134217726 بنایا جائے گا، یہ کس طرح کا نتیجہ بنایا جائے گا؟

یہ عمل کو حاصل کرنے کے لئے، اس نمبر کو غیر منفی کی برابری نمائش میں تبدیل کرنا ہوتا ہے (اگرچ کہ نمبر خود منفی ہے)، جس کے لئے درج ذیل کو بروئے کار لایا جاتا ہے:

وارن آئی یونسجگست64 = -64 >>> 0;

تاہم، بعد میں نوم کی نوعیت کی تواسٹرنگ() سے اس کا حقیقی بائنری نمائش حاصل کریں گے، جس کی بنیاد 2 ہے:

آلرٹ (آئی یونسجگست64.تواسٹرنگ(2));

یہ 11111111111111111111111111000000 بنائیں گے، جو وارن میٹرک آپریٹر -64 کا بائنری کمپلیمنٹ ریپریزنٹیشن ہے، جو 4294967232 کا وارن انگلومرٹ رینج میں برابر ہے。

ایسے وجہ سے، مشتق کردہ بائیں سمت میں آؤٹ پلائسمنٹ آپریٹر کا استعمال دیرینت نہیں کریں