how to convert input taken by getchar_unlocked() to signed integers…

```
#define gc getchar_unlocked
void scan(int &x)
{
register int c = gc();
x = 0;
int neg = 0;
for(;((c<48 || c>57) && c != '-');c = gc());
if(c=='-') {neg=1;c=gc();}
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
if(neg) x=-x;
}
```

This function can be used to read both +ve and -ve integers using getchar_unlocked()

```
int get_num()
{
int num = 0;
char c = getchar_unlocked();
int flag = 0;
while(!((c>='0' & c<='9') || c == '-'))
c=getchar_unlocked();
if(c == '-')
{
flag = 1;
c=getchar_unlocked();
}
while(c>='0' && c<='9')
{
num = (num<<1)+(num<<3)+c-'0';
c=getchar_unlocked();
}
if(flag==0)
return num;
else
return -1*num;
}
```

Explanation : getchar_unlocked() is used to read character input. It is very fast compared to printf().

The working of function goes like this…

The first while loop keeps repeating until ‘c’ is given a value of a digit between 0-9 or ‘-’(in case of negative numbers).

If we encounter ‘-’ we initialise `flag = 1`

to make a note that its negative number later while the function returns the number.

The second while loop keeps repeating until `c`

gets a value of 0-9 and stops when any other character is read(Usually it would be a ’ '(space) or ‘\n’).

The statement `num = (num<<3)+(num<<1)+c-'0';`

turns character digit in `c`

to integer digit and is added to num*10(Left shift operators. num << a => num * (2^a) ). It can also be written as

```
num = num*10 + c-'0';
```

Finally, we return the value of `num`

depending on value of `flag`

(whether the number is -ve or +ve).

can somebody please explain the working…

thankyou

Edited with explanation…

can I apply this method for scanning long long ???or long long int???

Just replace int with long long int.