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

Kotlin 비트 및位移 연산

Kotlin은 비트와位移 연산을 수행하기 위한 여러 가지 함수(중위 형식)를 제공합니다. 이 글에서는 예제를 통해 Kotlin에서 비트 수준 연산을 배울 것입니다.

비트 연산자와位移 연산자를 사용하여 비트 수준 연산을 수행할 수 있는 두 가지 정수 타입(Int와 Long)에만 사용할 수 있습니다.

이러한 연산을 수행하기 위해 Kotlin은7중위 기호를 사용하는 함수.

비트 비교 (or)

or 함수는 두 값의 해당 비트를 비교합니다. 두 비트 중 하나라도1그럼1그렇지 않으면 0입니다. 예를 들어,

12 = 00001100 (이진)
25 = 00011001 = 00
12과25비트 비교 연산
   00001100 or
   00011001
   의 비트 보수 연산
   00011101  = 29 (10진수)

예제: 비트 비교 연산

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    예제: 비트 보수
    result = number1 or number2   // result = number1.or(number2)
    result = number.inv()
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

29

비트와 비교(비트 앤드)

and 함수는 두 값의 해당 비트를 비교합니다. 두 비트가 모두1그럼 계산 결과가1두 위치 중 하나라도 0이면, 계산 결과가 0입니다. 예를 들어,

12 = 00001100 (이진)
25 = 00011001 = 00
12과25의 비트 앤 연산
   00001100 and
   00011001
   의 비트 보수 연산
   00001000  = 8 (10진수)

예제: 비트 앤 연산

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    예제: 비트 보수
    result = number1 and number2   // result = number1.and(number2)
    result = number.inv()
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

8

비트 이이스(xor)

xor 함수는 두 값을 비교합니다. 해당 비트가 다르면1입니다. 해당 비트가 같으면 0입니다. 예를 들어,

12 = 00001100 (이진)
25 = 00011001 = 00
12과25의 비트 이이스 연산
   00001100 xor
   00011001
   의 비트 보수 연산
   00010101  = 21 (10진수)

예제: 비트 이이스

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    예제: 비트 보수
    result = number1 xor number2   // result = number1.xor(number2)
    result = number.inv()
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

21

비트 비트 inv()

비트 비트를 1로 바꿉니다 1inv() 함수는 비트 비트를 1로 바꿉니다. 이는 각 1 그리고 각

35 로 0.100011 = 00
35(이진)
  00100011 
  의 비트 보수 연산
  1101110________ 220  =

0 (10진수)

fun main(args: Array<String>) {
    val number = 35
    예제: 비트 보수
    val result: Int
    result = number.inv()
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

-36

println(result) -36 그래서 우리는 출력을 원합니다 220로 표시했기 때문입니다

이는 컴파일러가 이 숫자의2의 보수. 이진수의 부호.

모든 정수 n에 대해, n의2의 보수는-(n + 1)

 Decimal         Binary                      2's complement
---------       ---------          ---------------------------------------  
0             00000000          -(11111111+1) = -00000000 = -0(decimal)
1             00000001          -(11111110+1) = -11111111 = -256(decimal)
12            00001100          -(11110011+1) = -11110100 = -244(decimal)
220           11011100          -(00100011+1) = -00100100 = -36(decimal)
주의: 계산 중 오버플로우는 무시됩니다 2's complement.

35의 비트 보수는220(10진수).220의2의 보충 코드는-36따라서, 출력은-36그 대신220.

왼쪽 이동 연산자 (shl)

shl 함수는 비트 패턴을 지정된 수의 비트로 왼쪽으로 이동하며, 0 비트가 낮은 위치로 이동합니다.

212 (이진: 11010100)
212 shl 1 evaluates to 424 (이진: 110101000)
212 shl 0 evaluates to 212 (이진: 11010100)
212 shl 4 evaluates to 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)

이 숫자가2의 보수 번호가 있으면, 플래그位移을 높은 위치로 이동합니다.

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 함수는 가장 왼쪽 위치에 0을 이동시킵니다。

예제: 부호 있는和无부호 우측 이동

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

주의하십시오,2의 보충 코드, 부호 있는 우측 이동 함수와 부호 없는 우측 이동 함수의 작동 방식은 다릅니다。

2147483645의2의 보충 코드는3。