빠른 I/O를 위해이 코드를 발견했습니다.여기서 비트 시프 팅의 요점은 무엇입니까?
#include <cstdio>
inline void fastRead_int(int &x) {
register int c = getchar_unlocked();
x = 0;
int neg = 0;
for(; ((c<48 || c>57) && c != '-'); c = getchar_unlocked());
if(c=='-') {
neg = 1;
c = getchar_unlocked();
}
for(; c>47 && c<58 ; c = getchar_unlocked()) {
x = (x<<1) + (x<<3) + c - 48;
}
if(neg)
x = -x;
}
inline void fastRead_string(char *str)
{
register char c = 0;
register int i = 0;
while (c < 33)
c = getchar_unlocked();
while (c != '\n') {
str[i] = c;
c = getchar_unlocked();
i = i + 1;
}
str[i] = '\0';
}
int main()
{
int n;
char s[100];
fastRead_int(n);
printf("%d\n", n);
fastRead_string(s);
printf("%s\n", s);
return 0;
}
왜 비트 시프트 (X < < 1) + (X < < 3) 있는가? 또한 우리가 음수와 숫자 이외의 문자를 입력하면 어떻게됩니까?
무슨 일이 일어나고 있는지 또는 어떤 기능이 수행 중인지에 대해 알지 못하는 사이에는 비트 연산이 무엇을하는지 알기가 어렵습니다. 어떤 도움이된다면 1 비트 왼쪽 쉬프트는 2를 곱하는 것과 같고 3 비트 왼쪽 쉬프트는 8을 곱하는 것과 같습니다. –
전체 코드를 추가했습니다. 블로그 게시물은 다음과 같습니다. http://digital-madness.in/blog/2013/fast-io-in-c/#comment-2137 기본적으로이 방법은 빠른 I/O를위한 경쟁 프로그래밍에 사용됩니다. – rishiag
'(x << 1) + (x << 3)'은'10'을 곱한 것과 같습니다. 숫자를 10 진수로 표현하면 "left shit"(예 :'12 * 10 = 120')입니다. 'c - 48'은 끝에 새로운 숫자를 추가합니다. – Nbr44