Reputation: 103
I'm implementing a JPEG-Decoder and in one step I need to determine the sign of a value from a given number of bits (positive if 1th bit = 1)
.
When the 1th bit is 0
then I have to get the two's complement from this value and additionaly add 1 to result.
I've have the following function to do this job:
#include <stdio.h> /* printf */
#include <string.h> /* strcat */
#include <stdlib.h> /* strtol */
typedef int bool;
#define true 1
#define false 0
int DetermineSign(int val, int nBits)
{
bool negative = val < (1<<(nBits-1));
if (negative)
{
// (-1 << (s)), makes the last bit a 1, so we have 1000,0000 for example for 8 bits
val = val + (-1 << (nBits)) + 1;
}
// Else its unsigned, just return
return val;
}
Could anyone explain please what does this expression (-1 << (nBits))
do and how it works?
I know there is a comment from author to explain it, but I also tested it with the following function and it returns another result.
const char *byte_to_binary(int x)
{
static char b[9];
b[0] = '\0';
int z;
for (z = 128; z > 0; z >>= 1)
{
strcat(b, ((x & z) == z) ? "1" : "0");
}
return b;
}
int main(void)
{
char testValue = 0;
testValue = (-1 <<(testValue));
printf("%s\n", byte_to_binary(testValue)); // output 1111 1111 doesn't it has to be 1000 000?
return 0;
}
Thank you!
Upvotes: 1
Views: 113
Reputation: 12992
What (-1 << (nBits))
does is that the left operands value(-1) is moved left by the number of bits specified by the right operand (nBits). In decimal representation the expression x<<y
equals to multiplying x by 2 y times,for example:
x=2,y=3 ,after x<<y
x equals to 16.
Upvotes: 1
Reputation: 30166
It replaces the right-most (least significant) ones with zeros:
-1 << 0 == 0xFFFFFFFF
-1 << 1 == 0xFFFFFFFE
-1 << 2 == 0xFFFFFFFC
-1 << 3 == 0xFFFFFFF8
-1 << 4 == 0xFFFFFFF0
Upvotes: 4