🙇‍♀️데이터 갖고 놀기

🪐정수

#include <iostream>
using namespace std;

// 0이 아닌 초기화 값이 있으면 .data 영역
int hp = 100;

// 초기값이 0이거나, 초기값이 없는 변수라면 .bss 영역

char a; // 1byte (-128~127)
short b; // 2byte (-32768~32767)
int c; // 4byte (-21.4억~21.4억)
__int64 d; // 8byte (long long) (매우 큼)

unsigned char a; // 1byte (0~255)
unsigned short b; // 2byte (0~65535)
unsigned int c; // 4byte (42.9억)
unsigned __int64 d; // 8byte (long long) (매우 큼)

// 참고) 이론적으로 양수만 존재할 수 있는 데이터 unsigned

int main()
{
    cout << "체력이" << hp << "남았습니다" << endl;
}

🪐불리언과 부등소수점

  • 실수 (부동소수점)
    • .을 유동적을 움직여서 표현하는 방법

1) 정규화 0.3141592 * 10 2) 3141582 (유효숫자) 1 (지수)

  • float 부호(1) 지수(8) 유효숫자(23) = 32비트 = 4바이트
  • double 부호(1) 지수(11) 유효숫자(52) = 64비트 = 8바이트

  • ex) -3.375라는 값을 저장
    • 1) 2진수 변환 = (3) + (0.375) = 0b11 + 0b0.011 = 0b11.011
      • 0.375 = 0.5 * 0 + 0.25 * 1 + 0.125 * 1 = 0b0.011
    • 2) 정규화 0b1.1011 * 2^1
      • 1(부호) 1(지수) 1011(유효숫자)
      • 단 지수는 unsigned byte라고 가정하고 숫자+127 만들어줌
      • 예상 결과 : 0b 1 10000000 1011000’0000’0000’0000’0000
  • 프로그래밍할 때 부동소수점은 ‘근사값’이라는 것을 기억
  • 특히 수가 커질 수록 오차 범위도 매우 커짐
  • 실수 2개를 == 으로 비교하는 것은 지양

🪐문자와 문자열

// char : 알파벳 / 숫자 문자를 나타낸다 // wchar_t : 유니코드 문자를 나타낸다

// ASCII (American Standard Code for Information Interchange)

// ‘문자’의 의미로 작은 따옴표 ‘’ 사용 char ch = ‘a’; char ch2 = ‘1’; char ch3 = ‘a’ + 1;

wchar_t wch = L’안’;

  • Escape Sequence
    • 표기하기 애매한 애들을 표현
    • \0 = 아스키코드0 = NULL
    • \t = 아스키코드9 = Tab
    • \n = 아스키코드10 = LineFeed (한줄 아래로)
    • \r = 아스키코드13 = CarriageReturn (커서 «)
    • '
  • 문자열
  • 정수 (1~8바이트) 고정 길이로
  • 끝은 NULL (0)
int main()
{
	char str[] = { 'h', 'e', 'l', 'l', 'o', '\0'};
	char str2[] = "Hello World";
	wchar_t str3[] = L"Hello World";

	cout << str << endl;

	// cout은 char 전용
	wcout.imbue(locale("kor"));
	wcout << wch << endl;
}

🪐산술 연산

unsigned char flag; // 부호를 없애야 >> 를 하더라도 부호비트가 딸려오지 않음

  • 산술 연산자
    • a에 b를 대입하고 b를 반환한다
    • -> b라는 바구니 안에 있는 값을, a라는 바구니 안에다 복사한다
  • 언제 필요한가? (사실 많이는 없음)
    • 비트 단위의 조작이 필요할 때
    • 대표적으로 BitFlag
  • ~ bitwise not
    • 단일 숫자의 모든 비트를 대상으로 0은 1, 1은 0으로 뒤바꿈
  • & bitwise and
    • 두 숫자의 모든 비트 쌍을 대상으로 and를 한다
  • bitwise or :
    • 두 숫자의 모든 비트 쌍을 대상으로 or를 한다
  • ^ bitwise xor
    • 두 숫자의 모든 비트 쌍을 대상으로 xor를 한다
  • 비트 좌측 이동 : «
    • 비트열을 N만큼 왼쪽으로 이동
    • 왼쪽의 넘치는 N개의 비트는 버림. 새로 생성되는 N개의 비트는 0.
    • *2를 할 떄 자주 보이는 패턴
  • 비트 우측 이동 : »
    • 비트열을 N만큼 오른쪽으로 이동
    • 오른쪽의 넘치는 N개의 비트는 버림
    • 왼쪽 생성되는 N개의 비트는
      • 부호 비트가 존재할 경우 부호 비트를 따라감 (부호있는 정수라면 이 부분을 유의)
      • 아니면 0

실습

  • 0b0000 [무적][변이][스턴][공중부양]

  • 무적 상태로 만든다

flag = (1 << 3);

  • 변이 상태를 추가한다 (무적 + 변이)

flag |= (1 << 2);

  • 무적인지 확인하고 싶다? (다른 상태는 관심 없음)
  • bitmask

bool invincible = ((flag & (1 << 3)) != 0);

  • 무적이거나 스턴 상태인지 확인하고 싶다면?

bool mask = (1 << 3) | (1 << 1);

bool stunOrInvincible = ((flag & 0b1010) != 0);

태그:

카테고리:

업데이트: