일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- carousel slider
- 앱
- 안보내짐
- Flutter
- Flutter SDK
- allowBackup
- 플러터
- gestureRecognizers
- project flow
- TCP/IP모델
- Set ID
- runSpacing
- 크롬개발자도구
- freezed
- VerticalMultiDragGestureRecognizer
- foreground
- 안드로이드
- Chrome Developer Tools
- fullBackupContent
- 입력 커서
- Could not create service of type FileAccessTimeJournal using
- 에러
- not working
- StringUtils.isEmpty
- StringUtils.isBlank
- 두 수의 나눗셈
- TextFormField
- 웹뷰
- 프로그래머스
- 플루터
- Today
- Total
흰오목눈이야 개발하자
[20181210]비트활용 && Shift 본문
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 |