الكلمات السابقة
مشغلات البتات هي عمليات أساسية للغاية ولا يتم استخدامها بشكل شائع لأنها ليست بديهية. ومع ذلك ، فهو سريع للغاية ويمكنه تحقيق نتائج جيدة عند استخدامه بشكل معقول. ستقدم هذه المقالة المشغل الذي يتم تجاهله في كثير من الأحيان في JavaScript - Bit Operator
تمثيل ثنائي
يتم تخزين جميع القيم في ECMASCRIPT بتنسيق IEEE-754 64 بت ، لكن مشغل BIT لا يعمل مباشرة على القيمة 64 بت ، ولكن يتم حسابها كصاحب صحيح موقّع 32 بت ، وقيمة الإرجاع هي أيضًا عدد صحيح موقّع 32 بت.
يتيح تحويل البت هذا المعاملة على كلا القيمتين على أنهما 0 عند تطبيق عمليات بت على قيم NAN و Infinity الخاصة
إذا تم تطبيق مشغل بت على قيمة غير رقمية ، فسيتم تحويل القيمة إلى قيمة رقمية باستخدام الرقم () أولاً ، والنتيجة هي قيمة رقمية
// '|' يعني أن البت أو العدد الصحيح و 0 bitwise أو العملية يمكن أن تحصل على نفسه ، ويمكن للعملية العشرية أو العملية الحصول على وحدة التحكم الدائرية. 0) ؛ // 0console.log ('12px' | 0) ؛ // 0console.log ('12 '| 0) ؛ // 12يستخدم عدد صحيح موقّع أول 31 من 32 بت لتمثيل قيمة عدد صحيح ، 32 بت لتمثيل رمز عدد صحيح ، 0 يمثل الرقم الإيجابي ، ويمثل 1 الرقم السلبي. يُطلق على البت الذي يمثل رمزًا بت علامة ، ويحدد قيمة بت الإشارة تنسيق قيم البتات الأخرى. من بينها ، يتم تخزين الأرقام الإيجابية بتنسيق ثنائي نقي ، ويمثل كل من البتات الـ 31 قوة 2. تمثل البت الأول (المسمى بت 0) 0 مرات من 2 ، ويمثل البت الثاني 1 1 ، وهكذا. تمتلئ البتات غير المستخدمة بـ 0 ، أي يتم تجاهلها.
على سبيل المثال ، فإن التمثيل الثنائي للقيمة العددية 18 هو 000000000000000000000000000010010 ، أو أكثر إيجاز 10010. هذه هي 5 بتات صالحة ، وهذه الأجزاء 5 نفسها تحدد القيمة الفعلية
console.log ((18) .ToString (2)) ؛ // "10010"
Console.log (0B0000000000000000000000000000001001010) ؛ // 18
يتم تخزين الأرقام السلبية أيضًا في الثنائي ، ولكن التنسيق المستخدم في تكملة اثنين. لحساب تكملة اثنين من العددية ، تحتاج إلى المرور من خلال الخطوات الثلاث التالية:
【1】 أوجد الكود الثنائي للقيمة المطلقة لهذه القيمة الرقمية
【2】 ابحث عن رمز عكسي ثنائي ، أي استبدال 0 بـ 1 ، استبدل 1 بـ 0
【3】 يضاف الرمز العكسي الثنائي الذي تم الحصول عليه إلى 1
على سبيل المثال ، لتحديد تمثيل ثنائي لـ -18 ، يجب أولاً الحصول على تمثيل ثنائي من 18 ، كما هو موضح أدناه:
0000 0000 0000 0000 0000 0000 0001 0010
بعد ذلك ، احسب الرمز العكسي الثنائي على النحو التالي:
1111 1111 1111 1111 1111 1111 1111 1110 1101
أخيرًا ، أضف 1 إلى الرمز العكسي الثنائي ، على النحو التالي:
1111 1111 1111 1111 1111 1111 1110 1101 1 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
لذلك ، فإن التمثيل الثنائي لـ -18 هو 1111 1111 1111 1111 1111 1111 1111 1111 1110 1110
ستبذل ECMASCRIPT قصارى جهدها لإخفاء كل هذه المعلومات منا. عند إخراج رقم سالب في شكل سلسلة ثنائية ، كل ما نراه هو أن الرمز الثنائي مع القيمة المطلقة لهذا الرقم السالب يسبقه علامة سلبية.
var num = -18 ؛ console.log (num.ToString (2)) ؛ // ' -10010'
يمكن لمشغل BIT أداء 7 أنواع من العمليات ، بما في ذلك Bitwise Non (NOT) ، Bitwise و (و) ، bitwise أو (OR) ، Bitwise Exclusive أو (XOR) ، التحول الأيسر ، التحول الأيمن الموقّع والتحول الأيمن غير الموقّع.
bitwise غير (لا)
يتم تمثيل bitwise non Operator بخط متموج (~). تتمثل نتيجة تنفيذ عدم تشغيل bitwise في إرجاع الكود العكسي للقيمة. جوهرها هو ناقص القيمة السلبية للمعامل بمقدار 1
var num1 = 25 ؛ var num2 = ~ num1 ؛ console.log (num2) ؛ //-26
يمكنك الحصول على تأثير التقريب من قبل bitwise المزدوج لأحد الأعداد. يمكنك الحصول على تأثير التقريب بواسطة bitwise المزدوج لعشرية.
console.log (~~ 3) ؛ // 3console.log (~~ 3.1) ؛ // 3Console.log (~~ 3.9) ؛ // 3
bitwise و (و)
يتم تمثيل Bitwise والمشغل برمز SUM (&) ، الذي يحتوي على رقمين للمشغل. في الأساس ، تتمثل Bitwise and Operation في مواءمة كل جزء من قيمتين ، ثم إجراء عملية وعملية على رقمين في نفس الموضع وفقًا للقواعد في الجدول التالي.
بت القيمة الأولى من نتيجة بت القيمة الثانية 1 1 11 0 00 1 00 0 0 0 0
سيعود Bitwise و Operation 1 فقط إذا كانت البتات المقابلة للقيمتين هي 1. أي بت هي 0 ، والنتيجة هي 0.
var iresult = 25 & 3 ؛ console.log (iresult) ؛ // "1"
// التحليل هو كما يلي 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
bitwise أو (أو)
يتم تمثيل bitwise أو المشغل برمز عمودي (|) ، وهناك أيضًا معاملتان. Bitwise أو العملية تتبع جدول الحقيقة التالي
القيمة الأولى من القيمة الثانية لتيمة القيمة الثانية 1 1 11 0 10 1 10 0 0 0
bitwise أو التشغيل إرجاع 1 إذا كان بت واحد 1 ، وفقط إذا كانت كلتا البتات 0.
var iresult = 25 | 3 ؛ console.log (Iresult) ؛ // "27"
// التحليل كما يلي 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0001 1011
يمكن أن تحصل عليه عدد صحيح و 0 bitwise أو العملية ، ويمكن أن تحصل عملية العشرية و 0 bitwise أو العملية على تأثير التقريب
console.log (3.1 | 0) ؛ // 3Console.log (3.9 | 0) ؛ // 3
bitwise xor (xor)
يتم تمثيل مشغل Bitwise XOR بواسطة Caret (^) وله معاملتين. ما يلي هو جدول الحقيقة لـ bitwise xor
بت القيمة الأولى من القيمة الثانية 1 1 01 0 10 1 10 0 0 0
إرجاع 0 عندما تكون قيمتان من bitwise xor متماثلان ، وإرجاع 1 عندما لا تكون في نفس الوقت
var iresult = 25 ^ 3 ؛ console.log (iresult) ؛ // "26"
// التحليل كما يلي 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0001 1010
"عملية Exoroor" لها استخدام خاص ، يقوم بإجراء ثلاث عمليات XOR على رقمين A و B في الخلافة ، Aˆ = B ، Bˆ = A ، Aˆ = B ، ويمكن تبديل قيمها. هذا يعني أن استخدام "الحصري أو التشغيل" يمكن أن يتبادل قيم متغيرين دون تقديم متغيرات مؤقتة
var a = 10 ، b = 9 ؛ a ^= b ، b ^= a ، a ^= b ؛ console.log (a ، b) ؛ // 9،10
// التحليل هو كما يلي = 0000 0000 0000 0000 0000 0000 0000 0000 1010 B = 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0 1001 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
يمكن أن يحافظ عدد صحيح مع XOR على 0 bitwise ، ويمكن تقريب العشري مع xor 0 bitwise
console.log (3.1 ^ 0) ؛ // 3Console.log (3.9 ^ 0) ؛ // 3
تحرك اليسار
يتم تمثيل مشغل التحول الأيسر من قبل اثنين من العلامات (<<). سيقوم هذا المشغل بنقل جميع أجزاء القيمة إلى اليسار بواسطة عدد البتات المحددة.
على سبيل المثال ، إذا تم تحويل القيمة 2 (الرمز الثنائي 10) إلى 5 بتات إلى اليسار ، فإن النتيجة هي 64 (1000000)
var oldvalue = 2 ؛ var newValue = oldvalue << 5 ؛ console.log (newValue) ؛ // 64
لن يؤثر الانتقال إلى اليسار على علامة العلامة من المعامل. بمعنى آخر ، إذا تم نقل -2 إلى 5 بت على اليسار ، فستكون النتيجة -64
var oldvalue = -2 ؛ var newValue = oldvalue << 5 ؛ console.log (newValue) ؛ // -64
يمكن أن يحقق التحول اليسرى 0 بتات التقريب تأثير
console.log (3.1 << 0) ؛ // 3console.log (3.9 << 0) ؛ // 3
وقع الحق
يتم تمثيل مشغل التحول الأيمن الموقّع من خلال علامات أكبر من العلامات (>>) ، والتي تنقل القيمة إلى اليمين ، ولكنها تحتفظ بتات البتات (أي علامات الإشارة). إن عملية التحول اليمنى الموقّع هي بالضبط عكس عملية التحول الأيسر ، أي إذا تم نقل 64 بت 5 بت إلى اليمين ، فسيتم تغيير النتيجة إلى 2.
var oldvalue = 64 ؛ var newValue = oldvalue >> 5 ؛ console.log (newValue) ؛ // 2
وبالمثل ، أثناء عملية التحول ، ستظهر الشواغر أيضًا في القيمة الأصلية. ومع ذلك ، هذه المرة تظهر الشواغر على الجانب الأيسر من القيمة الأصلية وعلى الجانب الأيمن من بت الإشارة. في هذا الوقت ، ستملأ ECMASCRIPT جميع المساحات الفارغة بقيمة بت الإشارة للحصول على قيمة كاملة
انتقل يمينًا لمحاكاة عملية المقسوم 2
console.log (5 >> 1) ؛ // 2console.log (15 >> 1) ؛ // 7
حق غير موقّع
يتم تمثيل مشغل التحول الأيمن غير الموقّع بـ 3 علامات أكبر من العلامات (>>>) ، والتي تحرك جميع 32 بت من القيمة إلى اليمين. بالنسبة للأرقام الإيجابية ، فإن نتيجة التحول الصحيح غير الموقّعة هي نفس التحول الصحيح الموقّع. من المريح نقل العلامة أمامها مباشرة. إذا قمت بتحريك 64 بتات غير موقعة ، فستظل النتيجة 2
var oldvalue = 64 ؛ var newValue = oldvalue >>> 5 ؛ console.log (newValue) ؛ // 2
ومع ذلك ، فإن الرقم السلبي مختلف. أولاً ، يملأ التحول الأيمن غير الموقّع البت الفارغ بـ 0 ، بدلاً من ملء البت الفارغ بقيمة البت الموقّع مثل التحول الأيمن الموقّع. لذلك ، فإن نتيجة التحول الصحيح غير الموقّع إلى رقم إيجابي هي نفس نتيجة تحول العنوان إلى العنوان ، لكن نتيجة الرقم السلبي مختلف. ثانياً ، سيعالج مشغل التحول الأيمن غير الموقّع الرمز الثنائي السلبي كرمز ثنائي إيجابي. علاوة على ذلك ، نظرًا لأن الرقم السلبي ممثل في مكمل الاثنين لقيمته المطلقة ، ستكون النتيجة كبيرة جدًا بعد التحول الأيمن غير الموقّع.
var oldvalue = -64 ؛ var newValue = oldvalue >>> 5 ؛ console.log (newValue) // 134217726
لتحديد التمثيل الثنائي لـ -64 ، يجب أولاً الحصول على التمثيل الثنائي لـ 64 ، كما هو موضح أدناه:
0000 0000 0000 0000 0000 0000 0100 0000
بعد ذلك ، احسب الرمز العكسي الثنائي على النحو التالي:
1111 1111 1111 1111 1111 1111 1111 1011 11111
أخيرًا ، أضف 1 إلى الرمز العكسي الثنائي كما هو موضح أدناه
1111 1111 1111 1111 1111 1111 1111 1011 1111 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
بعد نقل 5 بت إلى اليمين ، كما هو موضح أدناه:
0000 0111 1111 1111 1111 1111 11111 11111 1110Console.log (0B00000111111111111111111111111111111111111111111111111111) ؛ // 134217726666666666
التطبيقات المشتركة
【1】 عملية متعددة
استخدم التحول الأيسر (<<) لتحقيق عملية الضرب
console.log (2 << 1) ؛ // 4console.log (3 << 1) ؛ // 6console.log (4 << 1) ؛ // 8
【2】 قسمة العملية
استخدم التحول الأيمن الموقّع (>>) لمحاكاة عملية المقسوم 2
console.log (2 >> 1) ؛ // 1console.log (5 >> 1) ؛ // 2console.log (8 >> 1) ؛ // 4console.log (9 >> 1) ؛ // 4console.log (9 >> 1) ؛ // 4)
【3】 مبادلة القيمة
يمكن تحقيق تأثير تبادل القيمة باستخدام عملية XOR (^)
var a = 10 ، b = 9 ؛ a ^= b ، b ^= a ، a ^= b ؛ console.log (a ، b) ؛ // 9،10
【4】 لخص العشرية
يمكن تحقيق تأثير التقريب العشري عن طريق أخذ اثنين من bits غير bits ، 0 bitwise أو ، 0 bitwise أو ، 0 بتات اليسار و 0 بتات اليمين.
console.log (~~ 3.1) ؛ // 3Console.log (3.1 | 0) ؛ // 3Console.log (3.1^0) ؛ // 3Console.log (3.1 << 0) ؛ // 3Console.log (3.1 >> 0) ؛ // 3Console.log (3.1 >> 0) ؛
【5】 التبديل
يمكن استخدام مشغل BIT كمفتاح لتعيين خصائص الكائن. افترض أن الكائن يحتوي على أربعة مفاتيح ، كل مفتاح هو متغير. بعد ذلك ، يمكنك تعيين رقم ثنائي بأربعة بتات ، يتوافق كل منها مع مفتاح.
var flag_a = 1 ؛ // 0001var flag_b = 2 ؛ // 0010VAR flag_c = 4 ؛ // 0100VAR flag_d = 8 ؛ // 1000
يعين الرمز أعلاه أربعة مفاتيح A و B و C و D ، كل مفتاح يحتوي على بت ثنائي على التوالي.
لنفترض الآن أنه يجب تشغيل مفاتيح ABD الثلاثة ، يمكننا إنشاء متغير قناع
Var Mask = flag_a | flag_b | flag_d ؛ // 0001 | 0010 | 1000 => 1011
ينفذ الرمز أعلاه "أو العملية" على ثلاثة متغيرات ABD للحصول على 1011 مع قيمة قناع الثنائي
// "العملية" يضمن تشغيل المفتاح المحدد على الأعلام = أعلام | قناع؛
// يمكن أن تقوم "الجمعية" بإيقاف تشغيل جميع العناصر في الإعداد الحالي الذي يختلف عن إعدادات التبديل. أعلام = أعلام وقناع ؛
// يمكن أن يتحول "الحصري أو العملية" إلى (تبديل) الإعداد الحالي ، أي ، يمكن الحصول على القيمة العكسية للإعداد الحالي لأول مرة ، ويمكن الحصول على القيمة الأصلية بالتنفيذ مرة أخرى. أعلام = أعلام ^ قناع ؛
// "لا توجد عملية" يمكن أن تقلب الإعداد الحالي ، أي أن الإعداد الأصلي هو 0 ، ويصبح 1 بعد العملية ؛ الإعداد الأصلي هو 1 ، ويصبح 0flags بعد العملية = ~ أعلام ؛
المقدمة الشاملة أعلاه لمشغل JavaScript - Bit Complator هو المحتوى الكامل الذي شاركه المحرر. آمل أن يعطيك مرجعًا وآمل أن تدعم wulin.com أكثر.