반응형

비트연산이 속도가 빠르다


1. 비트연산: shift 연산


1). 부호가 없는 연산


 - 왼쪽으로 이동 : shl

 - 오른쪽으로 이동: shr


ex).


eax=4;

eax << 1 <- 8 (4*2)

eax << 2 <- 16(8*2)

eax << 3 <- 32(16*2)

  0000 0100

0000 1000 <- 왼쪽으로 한칸 이동한 경우

0001 0000 <- 왼쪽으로 한칸 이동한 경우



왼쪽으로 30 밀었다가 다시 오른쪽으로 30밀어도 복구가 안됨을 볼 수 있습니다



밀었던 값 11이 00으로 채워져서 쓰레기 값이 나옴을 볼 수 있습니다


이렇기 때문에 부호가 있는 경우에는 부호가 있는 연산자를 써야합니다


2). 부호가 있는 연산( MSB를 유지)


 - 왼쪽으로 이동 : sal

 - 오른쪽으로 이동 : sar


ex).


eax = -4

eax= 0, -0

 

 보수 : 0000 0100 -> 1111 1011 (1의 보수를 취한다)


 보수 : 0000 0000 -> 1111 1111(-0이 생기는데 이건 말이안된다)


그래서 2의보수를취합니다


1111 1011 -> 1111 1100


1111 1111 -> 1 0000 0000


부호가 있는 연산을 쓰면


1111 << 2 를 다시 >>2 해야 1100에서 1111이 됩니다





2.논리연산 : and, or , not


1). and


 1 and 1 = 1

 1 and 0 = 0

 0 and 1 = 0

 0 and 0 = 0



and 연산자를 통해서 0000 0000 1111 1111로 and 연산을 하여서


몫을 구할 수 있습니다



shr을 이용해서 나머지를 오른쪽으로 8비트 밀어서 나머지를 구할 수 있습니다


2). or


 1 or 1 = 1

 1 or 0 = 1

 0 or 1 = 1

 0 or 0 = 0


2-1) xor


 1 xor 1 =0

 1 xor 0 =1

 0 xor 1= 1

 0 xor 0 =0



xor로 같은걸 하면 초기화 기능이 되며


neg를 쓰면 음수로 나옵니다


3) not(neg)


 not 1 = 0

 not 0 = 1




3. 형변환


 1). 작은 -> 큰


 - movzx(zero extend) 

 - movsx(sign extend)

 


movsx를 쓰면 부호가 있는 숫자도  잘 이동이 됨을 볼 수 있습니다


 2). 큰 -> 작은


 eax> ax> al


 딱히 명령어가 없다 데이터가 손실될 우려가 있다




[실습]


 - 사칙연산 프로그램 작성


 - 입력 최대 크기는 32bit이다



  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기