English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، ستتعلم عمليات المواقع المختلفة في Swift. تستخدم هذه العمليات في الحسابات على مستوى المواقع.
المواقع تستخدم لتعريف الأعداد الثنائية. يمكن أن يكون لدى عدد ثنائي قيمتين محتملتين 0 أو 1. كبرمجي مبتدئ، لا تحتاج إلى استخدام العمليات على المواقع.
استخدام أنواع البيانات الأصلية، مثل integer، float، boolean، string، يكفي. عند التعامل مع البرمجة منخفضة المستوى، قد تحتاج إلى العمل على مستوى المواقع.
بالإضافة إلىعمليات أساسيةبالإضافة إلى ذلك، يقدم Swift مجموعة متنوعة من العملاء لتعامل المواقع. هذه العملاء تشبه العملاء المنطقية، ولكنها تعامل البيانات (المواقع) تمثيلها الثنائي.
عمليات غيرية هي عمليات تستخدم لتغيير المواقع الفردية للعناصر. العنصر هو المتغير أو الثابت الذي يتم تنفيذ العمليات عليه.
فيما يلي قائمة بجميع عمليات غيرية المتاحة في Swift:
ممثلة بالرأس العكسية ~، يمكن تطبيقها على عنصر واحد. هذا سيقوم بتحويل كل موقع. أي أن 1 سيغير إلى 0، و0 سيغير إلى 1.
إذا كان x هو متغير/ثابت يحتوي على قيمة ثنائية (أي 0 أو 1)، يمكن تمثيل عمليات غيرية متغير x في الجدول التالي:
x | ~x |
---|---|
0 | 1 |
1 | 0 |
let initalNumber: UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
254
في البرنامج المذكور أعلاه، نوع جملة let initalNumber:UInt8 = 1 هو unsigned int، حجمه 8 بت. لذلك، يمكن تمثيل 1 العد الأسي كـ 00000001 ثنائي.
عمليات غيرية ستجعل كل موقع من المواقع أو القيم، موقع 0 سيغير إلى 1، و1 سيغير إلى 0. لذلك، يحتوي الرقم المعكوس على المواقع 11111110. عند تحويله إلى العد الأسي، يُمثل 254. لذلك، سينشأ عن جملة print(invertedNumber) خروج 254 على الشاشة.
يمكن أيضًا تنفيذ عمليات غيرية مباشرة في البتات، كما هو موضح أدناه:
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
0
محتوى bits الأولية يحتوي على القيمة الثنائية 11111111، والتي تتناظر مع 255 في العد الأسي. من أجل تمثيل الرقم الثنائي، نستخدم في النص 0b كمقدمة. إذا لم يكن هناك 0b كمقدمة، سيقوم بتقديمها كعدد عادي، مما يؤدي إلى خطأ التفوق (UInt8 يمكنه تخزين الأعداد بين 0 و255 فقط).
由于我们使用了按位非运算符,因此将所有1都更改为0。因此,常量reverseBits包含00000000,这等效于UInt8中的0。
let initalNumber: Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
-2
在上面的程序中,十进制的1可以二进制表示为00000001。 按位非运算符将更改变量或常量的所有位,将位0更改为1,将1更改为0。因此,反转数字包含位11111110。这应在屏幕中输出254。 而是返回-2。 奇怪吧? 让我们在下面看看这是如何发生的。
let initalNumber: Int = 1是一个有符号 Int,可以同时包含正整数和负整数。这就是为什么当我们对有符号整数应用非运算符时,返回的二进制数也可能表示负数。
编译器如何将 -2 解释 为11111110 二进制形式?
编译器使用二进制补码表示整数。 要获得整数的二进制补码负号,您应该首先以二进制形式写出数字,然后将数字取反,然后在结果中加一个。
求-2的补码的步骤:
以二进制形式写2: 00000010
反转数字。0变为1,而1变为0:11111101
加1: 11111110
这就是编译器将二进制数1111110解释为十进制中的-2的方式。 但是,编译器有一个我们没有注意到的小问题。 它还推断 invertedNumber 的类型为Int8类型。
为了理解这一点,让我们看下面的实例:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
-2 254
在上面的示例中,编译器仅对带符号的8位整数将二进制数处理为十进制的-2。因此,语句print(Int8(bitPattern: 0b11111110))在屏幕上输出-2。
但是对于大小为32/64位并且可以容纳较大值的普通整数类型,它将值解释为254。因此,语句在屏幕上print(0b11111110)输出254
يُمثلها بـ &، ويمكن تطبيقها على اثنين من العناصر. يتم مقارنة المواضيع الثنائية من قبل محرر الجمع الثنائي، ويُرجع 1 إذا كانت المواضيع الثنائية كلاهما 1، وإلا يتم إرجاع 0.
إذا كانت x و y متغيرات/مقادير تحافظ على القيم الثنائية (أي 0 أو 1)، يمكن تمثيل عملية الجمع الثنائي بين x و y في الجدول التالي:
x | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("ثنائي:", String(result, radix: 2)) print(result)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
ثنائي: 10000011 131
في البرنامج أعلاه، جملة let result = xBits & yBits تجمع المواضيع الثنائية ل xBits و yBits. إذا كانت المواضيع الثنائية كلاهما 1، يتم إرجاع 1، وإلا يتم إرجاع 0.
String(value, radix:) هو المبدأ الافتراضي لتمثيل الأرقام في نظامين مختلفين. إذا قمنا بتقديم قيمة القاعدة 2، يتم تحويل الرقم إلى نظام العد الثنائي. بشكل مشابه، يمكننا استخدام 16 لتمثيل السدسية، و10 لتمثيل العشري.
سيتم إدخال النص "ثنائي:" وString(result, radix: 2) في النص عند تنفيذ الجملة print("Binary:", String(result, radix: 2)). ثنائي: 10000011، 10000011 يساوي 131 في النظام العشري، ويُظهر جملة print(result) 131 في المحرر.
يُمثلها بـ |، ويمكن تطبيقها على اثنين من العناصر. إذا كان هناك موضوع واحد أو أكثر هو 1 في محرر أو الثنائي، يتم مقارنة المواضيع الثنائية وإنشاء نتيجة 1، وإلا يتم إرجاع 0.
إذا كانت x و y متغيرات/مقادير تحافظ على القيم الثنائية (أي 0 أو 1)، يمكن تمثيل عملية أو الثنائية بين x و y في الجدول التالي:
x | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
ثنائي: 11111111 255
في البرنامج أعلاه، جملة let result = xBits | yBits تجمع المواضيع الثنائية ل xBits و yBits. إذا كانت أي مواضيع هي 1، يتم إرجاع 1، وإلا يتم إرجاع 0.
تُظهر الجملة print("ثنائي:", String(result, radix: 2)) النتيجة على الشاشة.ثنائي: 11111111، لأن 11111111 يساوي 255 في النظام العشري، لذا فإن جملة print(result) تُظهر النتيجة على الشاشة.255
يُمثلها بتشير، ويمكن تطبيقها على اثنين من العناصر. يُقارن محرر إزالة التشابه البيني بين المواضيع، ويُنتج النتيجة 1 إذا كان هناك فقط موضوع واحد هو 1، وإلا يتم إرجاع 0.
إذا كانت x و y متغيرات/مقادير، يتم حفظ القيم الثنائية لها، وهي 0 أو 1. يمكن تمثيل عملية إزالة التشابه البيني بين المواضيع x و y في الجدول التالي:
x | y | x ^ y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits ^ yBits print("Binary:", String(result, radix: 2)) print(result)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
ثنائي: 1111100 124
في البرنامج المذكور أعلاه، الجملة let result = xBits ^ yBits تجمع بين الأجزاء الثابتة xBits و yBits.
سيتم إدخال النص "ثنائي:" وString(result, radix: 2) في النص عند تنفيذ الجملة print("Binary:", String(result, radix: 2)).ثنائي: 1111100(مما يعادل 01111100). لأن 1111100 يعادل 124 في النظام العشري، لذا سيتم إدخال النص في الشاشة عند تنفيذ الجملة print(result).124
تستخدم هذه العمليات لتحريك جميع الأعداد الثنائية في العدد المحدد من المواضع إلى اليسار أو اليمين، ويمكن تطبيقها على عمود واحد. وتعبر عنها كـ << أو >>.
هناك نوعان من عمليات التموضع الثنائي:
يُعبر عنه كـ <<
سيؤدي ذلك إلى تموضع الأعداد الثنائية إلى اليسار، ويتم تحديد التموضع من قبل الأعداد الثنائية التي تتبعها <<.
تعبئة الموضع الفارغ في عمليات التموضع الثنائي بالأصفار.
سيضاعف التموضع الثنائي للعدد قيمته بموضع واحد.
دعوة بعض الأجزاء: UInt8 = 0b11000100 print(someBits << 1)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
136
في البرنامج المذكور أعلاه، استخدمنا عمليات التموضع الثنائي. يتم تموضع الأعداد الثنائية بموضع واحد ويتم تعبئة النهاية بالأصفار.
يمكنك أيضًا رؤية فقدان الأعداد الثنائية التي تموضعت من الجانب الأيسر "النهاية". لن تعود مرة أخرى من الجانب الأيمن. إذا تم تموضعها إلى اليسار بموضع واحد، سيتم إزالة 1 من الثنائي وسيتم إضافة 0 إلى اليمين لتعبئة القيمة المتموضعة، وستنتقل الموضع المتبقي للأعداد الثنائية إلى اليسار.
سيكون الناتج 10001000، مما يعادل 136 في UInt8. لذلك، سيتم إدخال 136 في جهاز العرض عند تنفيذ الجملة print(someBits<<1).
يُعبر عنه كـ >>
سيؤدي ذلك إلى تموضع الأعداد الثنائية إلى اليمين، ويتبعها >>
بالنسبة للعدد غير الم-signed، يتم تعبئة الموضع الفارغ بالأصفار.
بالنسبة للعدد الم-signed (يمكن أن يكون عدد سالب أيضًا)، يستخدم موقع الرمز للتعبير عن الموقع الذي يتم فيه إخلاء الموضع.
التموضع إلى اليمين بموضع واحد، سيقلل القيمة بالصفة نفسها.
دعوة بعض الأجزاء: UInt8 = 4 print(someBits >> 1)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
2
في البرنامج المذكور أعلاه، استخدمنا عمليات التحريك إلى اليمين للعدد غير الموقوع. استخدام >>1 يعني تحريك البتات إلى اليمين بنقطة واحدة. المكان الفارغ الذي يتركه عملية التحريك في العدد غير الموقوع يكون دائمًا مليئًا بالأصفار.
لأن، 4 في النظام الثنائي يمثل 00000100. تحريكه إلى اليمين بنقطة واحدة، ينتج 00000010، مما يعادل 2 في UInt8. لذلك، جملة print(someBits>>1) تظهر 2 على الشاشة.
let someBits:Int = -4 print(someBits >> 1)
عند تشغيلك للبرنامج المذكور أعلاه، الناتج سيكون:
-2
في البرنامج المذكور أعلاه، استخدمنا عمليات التحريك إلى اليمين للعدد غير الموقوع. على عكس الأرقام الإيجابية، يتم استخدام >> لعدد سالب، ويتم ملء المكان الفارغ بـ 1 بدلاً من 0.
لأن، -4 في النظام الثنائي يمثل 11111100. تحريكه إلى اليمين بنقطة واحدة ووضع 1 في المكان الفارغ، ينتج 11111110، مما يعادل -2 من نوع Int8. لذلك، جملة print(someBits>>1) تظهر -2 على الشاشة.