Котлин пружа неколико функција (у облику инфикса) за обављање битних и битних помака. У овом чланку ћете научити да изводите операције на нивоу бита у Котлину уз помоћ примера.
Оператори битног помака и помака битова користе се на само два интегрална типа ( Int
и Long
) за извођење операција на нивоу бита.
Да би извршио ове операције, Котлин пружа 7 функција користећи инфиксну нотацију.
1. или
or
Функција упоређује одговарајуће делове две вредности. Ако је један од битова 1, даје 1. Ако није, даје 0. На пример,
12 = 00001100 (у бинарном) 25 = 00011001 (у бинарном) Битно ИЛИ рад 12 и 25 00001100 или 00011001 ________ 00011101 = 29 (у децималном)
Пример: битни или рад
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )
Када покренете програм, излаз ће бити:
29
2. и
and
Функција упоређује одговарајуће делове две вредности. Ако су оба бита 1, вреднује се као 1. Ако је било који од битова 0, процењује се на 0. На пример,
12 = 00001100 (у бинарном) 25 = 00011001 (у бинарном) Бит рад 12 и 25 00001100 и 00011001 ________ 00001000 = 8 (у децималном)
Пример: Битни и рад
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )
Када покренете програм, излаз ће бити:
8
3. кор
xor
Функција упоређује одговарајуће делове две вредности. Ако су одговарајући битови различити, даје 1. Ако су одговарајући битови исти, даје 0. На пример,
12 = 00001100 (у бинарном) 25 = 00011001 (у бинарном) Битно ИЛИ рад 12 и 25 00001100 кор 00011001 ________ 00010101 = 21 (у децималном)
Пример: Битовна кор операција
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )
Када покренете програм, излаз ће бити:
21
4. инв ()
Функција инв () обрће образац бита. Прави сваких 0 до 1 и сваких 1 до 0.
35 = 00100011 (у бинарном) Битни комплемент Операција 35 00100011 ________ 11011100 = 220 (у децималном)
Пример: Битни комплемент
fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )
Када покренете програм, излаз ће бити:
-36
Зашто добијамо излаз -36 уместо 220?
То је зато што компајлер приказује комплемент броја 2 тог броја; негативан запис бинарног броја.
За било који цео број н, допуна броја 2 биће н -(n+1)
.
Допуна децималног Бинарног 2 --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (децимални) 1 00000001 - (11111110 + 1) = -11111111 = -256 (децимални) 12 00001100 - (11110011 +1) = -11110100 = -244 (децимални) 220 11011100 - (00100011 + 1) = -00100100 = -36 (децимални) Напомена: Преливање се занемарује током израчунавања комплемента 2.
Допунски додатак од 35 је 220 (у децималу). Додатак двојке од 220 је -36. Дакле, излаз је -36 уместо 220.
5. схл
У shl
Функција помера угризао образац са леве стране одређеног броја одређених бита, а нула битови се помера у лов-реда позицијама.
212 (у бинарном: 11010100) 212 схл 1 процењује на 424 (у бинарном: 110101000) 212 схл 0 процењује на 212 (у бинарном: 11010100) 212 схл 4 процењује на 3392 (у бинарном: 110101000000)
Пример: Промена у лево
fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )
Када покренете програм, излаз ће бити:
424 212 3392
6. схр
На shr
функција промене угризао Паттери са десне стране цертин броја одређених бита.
212 (у бинарном: 11010100) 212 схр 1 процењује на 106 (у бинарном: 01101010) 212 схр 0 процењује на 212 (у бинарном: 11010100) 212 схр 8 процењује на 0 (у бинарном: 00000000)
Ако је број потписан као допуна броја 2, знаковни бит се помера у позиције високог реда.
fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )
Када покренете програм, излазак ће бити:
106 212 0
7. усхр
У ushr
Функција помера нулу на крајњој левој позицији.
Пример: потписана и непотписана десна смена
fun main(args: Array) ( val number1 = 5 val number2 = -5 // Signed right shift println(number1 shr 1) // Unsigned right shift println(number1 ushr 1) // Signed right shift println(number2 shr 1) // Unsigned right shift println(number2 ushr 1) )
Када покренете програм, излаз ће бити:
2 2 -3 2147483645
Обратите пажњу, како потписана и непотписана функција десног помака другачије функционише за комплемент 2.
Допуна 2 2147483645
је 3
.