본문 바로가기

IT/Blockchain

go-ethereum 코드 분석(2) - 연산자

728x90

https://geth.ethereum.org/

 

(GO의 연산자)

& = AND 연산자

| = OR 연산자

^ = XOR 연산자 (두 값이 서로 다른 경우에 1을 반환, 단독으로 쓸 경우 반전이 됨)

! = NOT 연산자  (1 = true, 0 = false) (^을 단독으로 사용하는 것과 같음)

&^ = AND NOT 연산 수행 ('첫째값이 1이고 두번째 값 0인 경우에만 1을 반환'으로 외울수도 있음)

 

연산자 우선 순위

  • 같은 우선 순위인 경우 앞의 연산자부터 수행

PrecedenceOperator

5 *   /   %   <<   >>   &   &^
4 +   -   |   ^
3 ==   !=   <   <=   >   >=
2 &&
1 ||

 

 

(참고)

go-ethereum 소스에서의 사용 사례

github: https://github.com/ethereum/go-ethereum

  • 소스 위치: common/math/big.go
  • 코드
import (
	"fmt"
	"math/big"
)

...

const (
	// number of bits in a big.Word
	wordBits = 32 << (uint64(^big.Word(0)) >> 63)
	// number of bytes in a big.Word
	wordBytes = wordBits / 8
)

...
  • 설명
    • ^big.Word(0) = 0으로된 bit를 ^로 반전하여 모두 1이 되고
      • go package 지원 type ( type Word uint ) => 그냥 uint는 프로그램이 동작하는 시스템과 같으므로 보통 uint64와 같음.
    • 괄호 안에서 먼저 오른쪽으로 63번을 이동하면 마지막 1만 남음 (0000 0001)
    • 그리고 32(0010 0000)보다 왼쪽으로 1을 이동하하게 됨.  0100 0000 이 되어 64가 됨
    • 즉, wordBits = 64, wordBytes = 8 을 입력 
    • CPU에 32bit/64bit에 맞춰 wordBits를 지정하게 되는 방식
728x90