Mathijs - 7 months ago 40

C# Question

I know that the << operand shifts the left value of the operand with the value on the right with bits. So 1 << 2 would give 4. And the | operand copies a bit if it exists in either value. But I simply can't get my head around the code.

`private static bool isPandigital(long n)`

{

int digits = 0;

int count = 0;

int tmp;

while (n > 0)

{

tmp = digits;

digits = digits | 1 << (int)((n % 10) - 1);

if (tmp == digits)

{

return false;

}

count++;

n /= 10;

}

return digits == (1 << count) - 1;

}

Why does it say 1 << in line 8? And why is the module - 1?

On top of that I don't know what is happening on the last line when the value is returned. Help would be greatly apreciated. Thanks very much!

Answer

Doing

```
digits = digits | 1 << (int)((n % 10) - 1);
```

is the same thing as

```
long temp1 = n % 10; //Divide the number by 10 and get the remainder
long temp2 = temp1 - 1; //Subtract 1 from the remainder.
int temp3 = (int)temp2; //cast the subtracted value to int
int temp4 = 1 << temp3; //left shift 1 to the casted value. This is the same as saying "two to the power of the value of temp3"
int temp5 = digits | temp4; //bitwise or together the values of digits and that leftshifted number.
digits = temp5; //Assign the or'ed value back to digits.
```

The last line

```
return digits == (1 << count) - 1;
```

is just doing the same thing as

```
int temp1 = 1 << count; //left shift 1 `count` times, this is the same as saying "two to the power of the value of count"
int temp2 = temp1 - 1; //Subtract 1 from the leftshifted number.
bool temp3 = digits == temp2; //test to see if digits equals temp2
return temp3;
```

I don't know what "pandigital" means, but this break apart can help you understand what is happening.

Source (Stackoverflow)