English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل Kotlin الأساسي

تحكم في العملية في Kotlin

الوظائف في Kotlin

النصوص في Kotlin

Kotlin متقدم (OOP)

عمليات bitwise و عمليات الديسيملة في Kotlin

يقدم Kotlin عدة وظائف (بصيغة infix) لتنفيذ العمليات bitwise و العمليات الديسيملة. في هذا المقال، ستتعلم كيفية تنفيذ العمليات bitwise في Kotlin باستخدام الأمثلة.

يستخدم علامات التباين bitwise و عمليات الديسيملة فقط على أنواع البيانات الصحيحة (Int و Long) لتنفيذ العمليات على المستوى اللوحي.

لتنفيذ هذه العمليات، يقدم Kotlin 7 وظائف باستخدام الرمز المدمج.

أو bitwise (or)

وظيفة أو bitwise تقارن بين المواضع المماثلة لقيمين. إذا كان أي موضع من المواضع المماثلة يساوي 1، فإن النتيجة تكون 1. وإلا تكون 0. على سبيل المثال،

12 = 00001100 (الرقم الثنائي)
25 = 00011001 (الرقم الثنائي)
عمليات أو bitwise بين 12 و 25
   00001100 or
   00011001
   ________
   00011101 = 29 (decimal)

مثال: عملية أو bitwise

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    val result: Int
    result = number1 or number2 // result = number1.or(number2)
    println(result)
}

عند تشغيل هذا البرنامج، الناتج هو:

29

التغيير الثنائي(and)

تقارن وظيفة and القيم المتبادلة. إذا كانت القيم المتبادلة كلاهما 1، فإن القيمة هي 1. إذا كان أي من القيم المتبادلة 0، فإن القيمة هي 0. على سبيل المثال،

12 = 00001100 (الرقم الثنائي)
25 = 00011001 (الرقم الثنائي)
عمليات التغيير الثنائي لعدد 12 و 25
   00001100 and
   00011001
   ________
   00001000  = 8 (الرقم العشري)

مثال: عمليات التغيير الثنائي

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    val result: Int
    result = number1 and number2         // result = number1.and(number2)
    println(result)
}

عند تشغيل هذا البرنامج، الناتج هو:

8

التغيير الثنائي(xor)

تقارن وظيفة xor القيم المتبادلة. إذا كانت القيم المتبادلة مختلفة، فإن القيمة هي 1. إذا كانت القيم المتبادلة متطابقة، فإن القيمة هي 0. على سبيل المثال،

12 = 00001100 (الرقم الثنائي)
25 = 00011001 (الرقم الثنائي)
عمليات التغيير الثنائي لعدد 12 و 25
   00001100 xor
   00011001
   ________
   00010101  = 21 (الرقم العشري)

مثال: عمليات التغيير الثنائي

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    val result: Int
    result = number1 xor number2         // result = number1.xor(number2)
    println(result)
}

عند تشغيل هذا البرنامج، الناتج هو:

21

التغيير الثنائي inv()

وظيفة inv() تقوم بالتغيير الثنائي. إنها تجعل كل 0 إلى 1، وكل 1 إلى 0.

35 = 00100011 (الرقم الثنائي)
عمليات التعويض الثنائي لعدد 35
  00100011 
  ________
  11011100  = 220 (الرقم العشري)

مثال: التعويض الثنائي

fun main(args: Array<String>) {
    val number = 35
    val result: Int
    result = number.inv()
    println(result)
}

عند تشغيل هذا البرنامج، الناتج هو:

-36

لماذا نريد طباعة -36 بديلاً عن 220?

هذا لأن المبرمج عرض ثنائية التعويض الخاصة بالعدد. علامة السلب في العدد الثنائي.

لأي عدد صحيح صغير n، ستكون ثنائية n - (n + 1).

 Decimal                                     Binary                                                                         2's complement
---------                                 ---------                                 ---------------------------------------  
0                                         00000000                                 -(11111111+1) = -00000000 = -0(الرقم العشري)
1                                 00000001                                 -(11111110+1) = -11111111 = -256(عشري)
12                                 00001100                                 -(11110011+1) = -11110100 = -244(عشري)
220                                 11011100                                 -(00100011+1) = -00100100 = -36(عشري)
ملاحظة: تُتجاهلُ الزيادةُ عند حساب مضاد الكسر

مضاد الكسرُ للعدد 35 هو 220 (عشري). مضاد الكسرُ للعدد 220 هو -36. لذلك، النتيجةُ هي -36 而非 220.

عمليات التحريك اليساريُّ (شل)

دالة shl تتحركُ نمطُ البتات إلى اليسار بعددٍ معينٍ من البتات، وتبدأُ البتاتُ بالصفر

212 (ثنائي: 11010100)
212 shl 1 يعادله 424 (ثنائي: 110101000)
212 shl 0 يعادله 212 (ثنائي: 11010100)
212 shl 4 يعادله 3392 (ثنائي: 110101000000)

مثال: التحريك اليساريُّ

fun main(args: Array<String>) {
    val number = 212
    println(number shl 1)
    println(number shl 0)
    println(number shl 4)
}

عند تشغيل هذا البرنامج، الناتج هو:

424
212
3392

عمليات التحريك اليمينيُّ الموقوتة (shr)

دالة shr تتحركُ نمطُ البتات إلى اليمين بعددٍ معينٍ من البتات

212 (ثنائي: 11010100)
212 shr 1 يُحسب بأنه 106 (ثنائي: 01101010)
212 shr 0 يُحسب بأنه 212 (ثنائي: 11010100)
212 shr 8 يُحسب بأنه 0 (ثنائي: 00000000)

إذا كان العددُ هو مضاد الكسر، فسيتمُ تحريك علامة النهاية إلى الوضع الأعلى

fun main(args: Array<String>) {
    val number = 212
    println(number shr 1)
    println(number shr 0)
    println(number shr 8)
}

عندما تقومُ بتنفيذ البرنامج، النتيجةُ ستكون:

106
212
0

عمليات التحريك اليساريُّ غيرُ الموقوتة (ushr)

دالة ushr تضيف الصفر إلى أعلى الوضع

مثال: التحريك اليمينيُّ واليساريُّ

fun main(args: Array<String>) {
    val number1 = 5
    val number2 = -5
    // تدوير المتبقي
    println(number1 shr 1)
    // تدوير غير المتبقي
    println(number1 ushr 1)
    // تدوير المتبقي
    println(number2 shr 1)
    // تدوير غير المتبقي
    println(number2 ushr 1)
}

عند تشغيل هذا البرنامج، الناتج هو:

2
2
-3
2147483645

للتباين، يعمل دالة التدوير الأيمن المتبقي ودالة التدوير الأيمن المتبقي بشكل مختلف.

العدد 2147483645 هو المتبقي من 2 هو 3.