흰오목눈이야 개발하자

[20181210]비트활용 && Shift 본문

C

[20181210]비트활용 && Shift

흰오목눈이 2018. 12. 10. 19:28

gcc 파일.파일확장명

ex) gcc input.c

:: 컨파일러,빌드 작업 끝내고 a.exe(실행파일)라는 걸 만들어 줌

 


 

<코드 러너를 터미널에서 실행 방법>

setting - code-runner: run in terminal = true;

<터미널에서 utf-8로 바꿔주는 명령어>

> chcp 65001

 

터미널이 에러로 안 열리는 분은

Setting - 우측상단 ... 에서 open settings.json 에서   "terminal.integrated.shell.windows 을 삭제 해보시면 될겁니다. 그래도 안되면 환경변수를 확인해보세요.

 

터미널 실행

 

PS C:\CStudy> gcc -g input.c -o input

PS C:\CStudy> ./input

 

 

[cmd창에서 실행 ] cd 폴더 - dir - gcc 파일명.파일확장자 - a

 

#include <stdio.h>//java import같은 개념

 

int main(){

    int a =0;

    double b;

 

    printf("input number : ");

 

    //scanf 만나면 입력할 때까지 대기하고 있다가 입력한 값을

 10진수 변환한 후에 a주소공간에 저장함

    scanf("%d",&a);

 

    printf("%d\n",a); // 초기화안하면 쓰레기 값을 출력함.

}

#include <stdio.h>

 

int main(){

    int a = 10; //signed int

    unsigned int b = -1; //b a보다 크다고 나옴.

    //1로꽉채워져있는비트를 b 넣음 a<b 연산한거. 타입이 다르면 타입을 맞출려고함. 작은 애가 애로 맞춰짐

    //서로 다른 타입이 연산하려 하면 작은 값이 값으로 변환되서 연산한다.

    //unsigned int 크기 때문에 signed int unsigned int 바뀐다.

    //0001010dlfkd 11111111이랑 비교함. 따라서 1 채워져있는 값이 .  따라서 b .

 

    if(a<b) printf("a<b");

    else    printf("a>b");

}

#include <stdio.h>

 

int main(){

    int in;

    char ch;

    float fl;

    double dbl;

 

    //첫번째 문자열안에 오로지 형식 변환 문자열만 써야함.\n을처음에쓰면안돼.

    scanf("%c %d %f %lf",&ch,&in,&fl,&dbl); //입력함수

    printf("%c %d %f %lf\n",ch,in,fl,dbl);  //출력함수

}

 

 

//서로 다른 타입이 연산하려 하면 작은 값이 값으로 변환되서 연산한다.

 

#include <stdio.h>

 

int main(){

    char addr[10]; //선언만함.

    addr[0] = 'S';

    addr[1] = 'e';

    addr[2] = 'o';

    addr[3] = 'u';

    addr[4] = 'l';

    addr[5] = '\0';

    

    printf("%s\n",addr);

    printf("%s\n", &addr[1]);

    // %s 주소를 받아서 주소로 , \0(==null) 나올 때까지 출력함.

 

    printf("%d, %d\n",addr, &addr[0]);

    // 6422304, 6422304 따라서 서로 값이 같은 .

    //배열명은 배열의 시작 주소다.  시작주소( 0번방의 주소) &addr[0] 배열명과 같다.

 }

#include <stdio.h>

 

int main(){

    //자바표현식 : char[] name = new char[10];

    //char ch; //1byte

    //korea 넣고 싶다. k,o,r,e,a 들어갈 있게하는 5byte이상의 메모리공간잡아야함

    // \0 문자열 마지막에 \0 추가되어야 문자열 완성

    char name[6] = "korea"; //6byte// |K|o|r|e|a|\0|

    

    printf("%s\n",name);

    printf("%c\n",name[0]); //0번방에 있는 것을 출력하겠다. \0 키보드의 아스키코드값. 따라서 눈에 안보임

 

 }

 

 

//배열명은 배열의 시작 주소다. 

시작주소( 0번방의 주소) & addr[0] 배열명과 같다.

// \0 문자열 마지막에 \0 추가되어야 문자열 완성


 

#include <stdio.h>

 

int main(){

    char name[10];

    int age;

    double weight, height, bmi; //bmi = 몸무게(kg)/키의제곱(m)

 

    //영어이름. 스페이스 없이. scanf 띄어쓰기 못받아들임.

 

    //scanf %s 뒤에 주소와야함 왜냐하면 scanf 주소받아 데이터추출할때쓰이니.

 

    printf("Input your name :");

    scanf("%s",name); //%s는주소를받고.배열명은배열의시작주소랑같음.상수다.

    printf("Age : ");

    scanf("%d", &age);

    printf("Weight : ");

    scanf("%lf",&weight);

    printf("Height : ");

    scanf("%lf",&height);

 

    bmi=weight/(height*height);

 

    printf("%s님의 지수는 %lf 입니다",name,bmi);

 }

// %s = name, %lf bmi 출력해주기 위해서 위해 .

 

 

 

 

 

 

 

 

 

 

 

 

< Shift >

#include <stdio.h>

 

int main(){

    //지역변수는 stack 잡힘. ch 아래에 쌓임.먼저 선언된 아래 쌓임.

    char ch = -1;

    char c1 = 'a';

 

    printf("%d %d\n",&ch,&c1); //6422319 6422318

 

    /* 

    printf("%x %x\n",ch,~ch); //16진수

     1 1 1 1  1 1 1 1

     -------  -------

        F           F   

    */

}

#include <stdio.h>

 

int main(){

    //산술쉬프트

    unsigned short ch= 0x8000;

    printf("%hd\n",ch);

    ch = ch >> 1; // 0100 0000 0000 0000 (x) -->이게 되기 위해서 unsigned붙임

    // 1100 0000 0000 0000 (o)

    printf("%hd\n",ch);

    

    // JAVA) >>> :: unsigned right shift (왜냐하면 자바에서는 unsigned 표시하는 없어서)

    // T. unsigned 되어야 논리쉬프트가 .

}

#include <stdio.h>

 

int main(){

    short ch= 0x1;

 

    printf("%hd\n",ch); //shrot타입의 decimal이라고 알려주기 위해서 hd

    ch = ch << 1;

 

    printf("%hd\n",ch);

 

    ch = ch << 1;

    

    printf("%hd\n",ch);

}

// 결과는 1 2 4

>>> :: unsigned right shift (왜냐하면 자바에서는 unsigned 표시하는 없어서)

 


#include <stdio.h>

 

int main(){

    short ch= 0x1;

 

    int i = 0;

    for(i=0; i<16; i++){//short타입은 2byte = 16bit

        printf("%d : %hd\n",i, ch);

        ch = ch << 1;

    }

    //-32768 나온이유는 1 움직이다가 부호비트까지 나온것.

 

    for(i=0; i<17; i++){

        printf("%d : %hd\n",i,ch);

        ch = ch << 1;

    } //음수가 되었다가 튕겨나가서 전부 0이됨.

 

    ch = 0x8000; //16진수 한자리가 4bit. 이렇게 해야 1byte .

short 2byte니까 4개해야맞지.//1000 0000 0000 0000

    for(i=16; i>0; i--){

        printf("%d : %hd\n",i,ch);

        ch = ch >> 1;

    }

    

}

0 : 1

1 : 2

2 : 4

3 : 8

4 : 16

5 : 32

6 : 64

7 : 128

8 : 256

9 : 512

10 : 1024

11 : 2048

12 : 4096

13 : 8192

14 : 16384

15 : -32768

 

0 : 0

1 : 0

2 : 0

3 : 0

4 : 0

5 : 0

6 : 0

7 : 0

8 : 0

9 : 0

10 : 0

11 : 0

12 : 0

13 : 0

14 : 0

15 : 0

16 : 0

16 : -32768

15 : -16384

14 : -8192

13 : -4096

12 : -2048

11 : -1024

10 : -512

9 : -256

8 : -128

7 : -64

6 : -32

5 : -16

4 : -8

3 : -4

2 : -2

1 : -1

 

 

#include <stdio.h>

/* mask에다가 내가 뽑아내고 싶은 부분만 1쓰고 나머지 0이됨

   특정한 비트에서 값을 뽑아내고 싶을 많이 . */

 

int main(){

    short value = 10;

    unsigned short mask = 0x8000; // 앞에거 뽑아내고 싶은 경우

    int result = 0;

    int i=0;

    for(i=0; i<16; i++){

        result = value & mask;

        if(result == 0) printf("0");

        else            printf("1");

 

        mask = mask >> 1;

    }

 

}

결과값) 0000000000001010

 

+)

0000 1010

1000 0000

&   X000 0000

---------------------

1000 0000

& : 특정비트를 추출할 사용

| : 특정비트를 클리어 시킬 사용

^ : 다를 참이다.

 

 

 


'C' 카테고리의 다른 글

[20181214] 2차원 배열  (0) 2018.12.14
[20181207]정리해야함  (0) 2018.12.10
[20181206]C 프로그램 설치+수의체계_비트  (0) 2018.12.07