본문 바로가기
코틀린 문법

22. 비트연산

by 농농씨 2023. 6. 4.

참조: 유튜브 디모의 코틀린

코드테스트사이트:play.kotlinlang.org

단축키(맥북):

맥북 스크린샷 바로 클립보드에 붙여넣기

-control+command+shift+3 or 4(3은 전체화면, 4는 마우스로 지정한 영역, 4일때 스페이스바 누르면 창캡처가능)

화면에 분할해놓은 창끼리 이동

-command+'

한 창에서 탭끼리 이동

-command+shift+{/}

 

//비트연산이란?
//정수형 변수를 사람이 사용하는 10진법으로 연산하는 대신 
//2진법인 비트단위로 연산할 수 있는 기능
//실무에서 비트연산은 거의 계산에는 사용하지 않으며
//(2진법을 이용한 연산 최적화가 필요하다면 대부분 컴파일러 기능을 사용함)
//정수형의 값을 비트단위로 나누어 데이터를 좀 더 작은 단위로 담아 
//경제성을 높이기 위한 용도로 사용됨
//예를 들어,
//00101000100010101001001001000....
//32비트인 Int타입 안에 32개의 0과 1로 된 서로 다른 값을 넣는다거나 
//앞의 5비트와 뒤의 27비트에 서로 다른 값을 넣는 식으로 
//변수 하나에 여러 개의 값을 담아 사용할 수 있음 
//
//다만, 비트연산을 사용하는 부하도 무시할 수 없으므로 
//주로 플래그값(여러개의 상태값을 0과 1로 담는 방법)을 처리하거나
//네트워크 등에서 프로토콜의 데이터 양을 줄이기 위해 자주 사용됨
//정수형 변수에 비트연산을 할때는 좌측이 상위비트, 우측이 하위비트임
//*참고로 코틀린은 모든 정수형이 부호를 포함하므로
//최상위비트를 -인지 +인지 표시하는 부호 비트로 사용하기 때문에
//이 부분에는 데이터를 담지 않는 것이 좋다!
//
//비트를 밀어주는
//bitwise shift operators(bitwise shift 연산자)
//부호비트를 제외한 모든 비트를
// 좌측으로 원하는만큼 밀어주는 기능:shl(shift left)
// 우측으로     :shr(shirt right)
//부호비트를 포함하여 모든 비트를 우측으로 밀어주는 기능
// :ushr(unsigned shirt right)
//ex. 0001010101010101010
//    0010101010101010100(shl)
//    0000101010101010101(shr)
//    0000101010101010101(ushr)
//
//일반적인 비트조작 연산자
//bitwise operators
//<and
//원본과 비교대상의 값을 비트단위로 비교하여 둘다 1인 경우만 1로 반환함
//ex. 1010 and 0110
//    결과값 0010
//<or
//값을 비교하여 하나라도 1이면 1로 반환
//ex. 1010 ad 0110
//   결과값 1110
//<xor
//두 값을 비교하여 같으면 0, 다르면 1로 반환
//ex. 1010 xor 0110
//    결과값 1100
//and연산자는 그 특성을 이용하여 두가지 기능으로 사용함
//-비트를 확인하는 방법
// 원하는 위치에만 1을넣어 비교해보면 1인지 0인지 확인 가능
// 
//ex. 원본 0110
//   비교값 0100 "아래서 세번째 비트의 값만 알고싶어!"
//     and
//   결과값 0100
//-비트를 clear하는 방법
// 즉,0으로 만들어줌, 비트를 0으로 만들고 싶은 부분에만 0 넣어 연산해주면
// 1인 부분만 남고 나머지는 모두 clear됨
//ex. 원본 0110
//     and
//   비교값 1100 "아래 두개의 비트를 0으로 만들고 싶어!"
//   결과값 0100
//
//or 연산자는 반대로 비트의 set연산, 즉 비트값을 1로 설정하고 싶을 때 사용
// 비트를 1로 만들고 싶은 부분에만 1을 넣어 연산해주면 
// 0인 부분은 그대로 남고 1인 부분만 set이 됨
//ex. 원본 0110
//      or
//  비교값 1100 "상위 두개의 비트를 1로 만들고 싶어!"
//   결과값 1110
//
//xor 연산자는 비교할 두 값이 비트별로 동일한지 비교함
//ex. 원본 0110
//      xor
//   비교값 1100 "내가 원하는 값과 비트들이 똑같을까?"
//   결과값 1010
//
//<inv()
// 비트를 모두 반전시키는 함수


fun main() {
    
    var bitData:Int=0b10000
    //Int변수 만들고 (하위)다섯번째 비트에 1 넣어줌
    //(지정되지 않은 상위 비트들은 0으로 채워짐)
    //2진수를 표시할 경우 0b붙이고 시작함
    
    //세번째 비트에 1을 set 해보자
    bitData=bitData or(1 shl 2)
    //1이라는 값을 shl을 사용하여 좌측으로 2번 민다
    //그리고 이 값을 bitData와 or 연산 하면 
    //(하위) 세번째 비트가 set된다
    //그리고 이 값을 다시 bitData에 할당
    println(bitData)//그냥 출력해봄
    println(bitData.toString(2))
    //bitData를 toString을 통해 2진수 형태의 '문자열'로 변경해 출력
    //*정수형의 경우 toString의 패러미터로 진법변화할 수 있다
    
    //and연산 통해 (하위)다섯번째 비트에 있는 값 꺼내 사용해보자
    var result=bitData and(1 shl 4)
    //1이라는 값을 shl을 사용하여 좌측으로 4번 밀자(0b10000이 됨)
    //그리고 이 값을 bitData와 and 연산하면 
    //(하위)다섯번째 비트의 값을 제외한 나머지는 0이 됨
    println(result.toString(2))
    //이 값을 변수 result에 넣고 바로 출력
    
    //우측으로 네번 밀어주면 원래의 값을 복원할 수도 있다(?)
    println(result shr 4)
    //0b1
    
    //(하위)다섯번째 비트에 있는 1을 clear해봅시다
    bitData=bitData and((1 shl 4).inv())
    //1이라는 값을 shl을 사용하여 좌측으로 4번 밀어줌(0b10000)
    //그리고 이 값에 다시 inv()함수를 사용하여 반전시킴(0b01111)
    //이것을 bitData와 and 연산하면(0b10100 and 0b01111)
    //0으로 반전된 (하위)다섯번째 비트만 clear됨
    println(bitData.toString(2))
    
    println((bitData xor(0b10100)).toString(2))
    //마지막으로 현재 bitData가 10100과 같은지 비트별로 확인 위해
    //xor연산하여 출력
    //(하위)다섯번째 비트만 다르기 때문에 10000이 출력될것을 예상 가능
    
}


'코틀린 문법' 카테고리의 다른 글

23. 코루틴을 통한 비동기 처리  (0) 2023.06.04
21. 변수의 다양한 사용방법  (0) 2023.06.03
20. 컬렉션함수(2)  (0) 2023.06.03
19. 컬렉션함수(1)  (0) 2023.06.03
18. Set과 Map  (0) 2023.05.31