ch2-bitstrings (Print bits of integers in C/C++)
Chapter_2 Exercise_2-5 getbits | Exercise_2-6 |
CONTENTS: bitstrings.c BitStrings.cpp
bitstrings.c download
#include <stdio.h> // for printf()
#include <limits.h>
#define LENGTH 100 // bits
// reverse s[], knowing its length:
void reverse(char s[], int len);
// get the bits of int x into bits[], return length of bits[] (no of bits):
int bitstring (char bits[], int x);
// get the bits of unsigned x into bits[], return length of bits[]:
int bitstringu (char bits[], unsigned x);
// get the bits of long x into bits[], return length of bits[]:
int bitstringl (char bits[], long x);
// get the bits of unsigned long x into bits[], return length of bits[]:
int bitstringul (char bits[], unsigned long x);
// get the bits of long long x into bits[], return length of bits[]:
int bitstringll (char bits[], long long x);
// get the bits of unsigned long long x into bits[], return length of bits[]:
int bitstringull (char bits[], unsigned long long x);
int main()
{
char bits[LENGTH];
int i; long l; long long ll;
bitstring(bits, 0);
printf ("0:\t\t%s\n", bits);
bitstring(bits, CHAR_MAX);
printf ("CHAR_MAX:\t%s\n", bits);
bitstringu(bits, UCHAR_MAX);
printf ("UCHAR_MAX:\t%s\n", bits);
bitstring(bits, CHAR_MIN);
printf ("CHAR_MIN:\t%s\n", bits);
bitstring(bits, -CHAR_MAX-1);
printf ("-CHAR_MAX-1:\t%s\n", bits);
bitstring(bits, SHRT_MAX);
printf ("SHRT_MAX:\t%s\n", bits);
bitstringu(bits, USHRT_MAX);
printf ("USHRT_MAX:\t%s\n", bits);
bitstring(bits, SHRT_MIN);
printf ("SHRT_MIN:\t%s\n", bits);
bitstring(bits, -SHRT_MAX-1);
printf ("-SHRT_MAX-1:\t%s\n", bits);
bitstring(bits, INT_MAX);
printf ("INT_MAX:\t%s\n", bits);
bitstringu(bits, UINT_MAX);
printf ("UINT_MAX:\t%s\n", bits);
bitstring(bits, INT_MIN);
printf ("INT_MIN:\t%s\n", bits);
bitstring(bits, -INT_MAX-1);
printf ("-INT_MAX-1:\t%s\n", bits);
bitstring(bits, -1);
printf ("-1:\t\t%s\n", bits);
i = UINT_MAX; // -1 (modulo 2 arithmetic)
bitstring(bits, i);
printf ("%d:\t\t%s\n", i, bits);
bitstringl(bits, LONG_MAX);
printf ("LONG_MAX:\t%s\n", bits);
bitstringul(bits, ULONG_MAX);
printf ("ULONG_MAX:\t%s\n", bits);
bitstringl(bits, LONG_MIN);
printf ("LONG_MIN:\t%s\n", bits);
bitstringl(bits, -LONG_MAX-1);
printf ("-LONG_MAX-1:\t%s\n", bits);
bitstringl(bits, -1l);
printf ("-1l:\t\t%s\n", bits);
l = ULONG_MAX; // -1l (modulo 2 arithmetic)
bitstringl(bits, l);
printf ("%ldl:\t\t%s\n", l, bits);
bitstringll(bits, LLONG_MAX);
printf ("LLONG_MAX:\t%s\n", bits);
bitstringull(bits, ULLONG_MAX);
printf ("ULLONG_MAX:\t%s\n", bits);
bitstringll(bits, LLONG_MIN);
printf ("LLONG_MIN:\t%s\n", bits);
bitstringll(bits, -LLONG_MAX-1);
printf ("-LLONG_MAX-1:\t%s\n", bits);
bitstringll(bits, -1ll);
printf ("-1ll:\t\t%s\n", bits);
ll = ULLONG_MAX; // -1ll (modulo 2 arithmetic)
bitstringll(bits, ll);
printf ("%lldll:\t\t%s\n", ll, bits);
return 0;
}
// reverse s[], knowing its length:
void reverse(char s[], int len)
{
int i = 0, j = len-1;
char temp;
while (i < j)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
// get the bits of int x into bits[], return length of bits[] (no of bits):
int bitstring(char bits[], int x)
{
int i = 0;
int mask = 01; // octal 1
while (mask != 0) // while(mask)
{
if ((x & mask) != 0) // if (x & mask)
{
bits[i++] = '1';
}
else {bits[i++] = '0';}
mask <<= 1; // mask = mask << 1;
}
bits[i] = '\0';
reverse(bits, i);
return i;
}
// get the bits of unsigned x into bits[], return length of bits[]:
int bitstringu(char bits[], unsigned x)
{
int i = 0;
unsigned mask = 01; // octal 1
while (mask != 0) // while(mask)
{
if ((x & mask) != 0) // if (x & mask)
{
bits[i++] = '1';
}
else {bits[i++] = '0';}
mask <<= 1; // mask = mask << 1;
}
bits[i] = '\0';
reverse(bits, i);
return i;
}
// get the bits of long x into bits[], return length of bits[]:
int bitstringl (char bits[], long x)
{
int i = 0;
long mask = 01; // octal 1
while (mask != 0) // while(mask)
{
if ((x & mask) != 0) // if (x & mask)
{
bits[i++] = '1';
}
else {bits[i++] = '0';}
mask <<= 1; // mask = mask << 1;
}
bits[i] = '\0';
reverse(bits, i);
return i;
}
// get the bits of unsigned long x into bits[], return length of bits[]:
int bitstringul (char bits[], unsigned long x)
{
int i = 0;
unsigned long mask = 01; // octal 1
while (mask != 0) // while(mask)
{
if ((x & mask) != 0) // if (x & mask)
{
bits[i++] = '1';
}
else {bits[i++] = '0';}
mask <<= 1; // mask = mask << 1;
}
bits[i] = '\0';
reverse(bits, i);
return i;
}
// get the bits of long long x into bits[], return length of bits[]:
int bitstringll (char bits[], long long x)
{
int i = 0;
long long mask = 01; // octal 1
while (mask != 0) // while(mask)
{
if ((x & mask) != 0) // if (x & mask)
{
bits[i++] = '1';
}
else {bits[i++] = '0';}
mask <<= 1; // mask = mask << 1;
}
bits[i] = '\0';
reverse(bits, i);
return i;
}
// get the bits of unsigned long long x into bits[], return length of bits[]:
int bitstringull (char bits[], unsigned long long x)
{
int i = 0;
unsigned long long mask = 01; // octal 1
while (mask != 0) // while(mask)
{
if ((x & mask) != 0) // if (x & mask)
{
bits[i++] = '1';
}
else {bits[i++] = '0';}
mask <<= 1; // mask = mask << 1;
}
bits[i] = '\0';
reverse(bits, i);
return i;
}
/*
gcc bitstrings.c -o bitstrings
./bitstrings
0: 00000000000000000000000000000000
CHAR_MAX: 00000000000000000000000001111111
UCHAR_MAX: 00000000000000000000000011111111
CHAR_MIN: 11111111111111111111111110000000
-CHAR_MAX-1: 11111111111111111111111110000000
SHRT_MAX: 00000000000000000111111111111111
USHRT_MAX: 00000000000000001111111111111111
SHRT_MIN: 11111111111111111000000000000000
-SHRT_MAX-1: 11111111111111111000000000000000
INT_MAX: 01111111111111111111111111111111
UINT_MAX: 11111111111111111111111111111111
INT_MIN: 10000000000000000000000000000000
-INT_MAX-1: 10000000000000000000000000000000
-1: 11111111111111111111111111111111
-1: 11111111111111111111111111111111
LONG_MAX: 0111111111111111111111111111111111111111111111111111111111111111
ULONG_MAX: 1111111111111111111111111111111111111111111111111111111111111111
LONG_MIN: 1000000000000000000000000000000000000000000000000000000000000000
-LONG_MAX-1: 1000000000000000000000000000000000000000000000000000000000000000
-1l: 1111111111111111111111111111111111111111111111111111111111111111
-1l: 1111111111111111111111111111111111111111111111111111111111111111
LLONG_MAX: 0111111111111111111111111111111111111111111111111111111111111111
ULLONG_MAX: 1111111111111111111111111111111111111111111111111111111111111111
LLONG_MIN: 1000000000000000000000000000000000000000000000000000000000000000
-LLONG_MAX-1: 1000000000000000000000000000000000000000000000000000000000000000
-1ll: 1111111111111111111111111111111111111111111111111111111111111111
-1ll: 1111111111111111111111111111111111111111111111111111111111111111
*/
Notes:
The bistring() functions are almost identical. It would be nice if we could have only one function and specify the type of x and mask in main(). This is hard to do in C (see Pseudo-generics_in_C on StackOverflow), but easy in C++ using generics (see BitStrings.cpp below). See also Exercise_3-26 (function print()) on the blog Thinking_in_C++_vol_1, Chapter_3 (The C in C++), Section Composite_Types.
Note how -1 and the maximum unsigned of integer types (int, long, long long) have the same bit pattern.
BitStrings.cpp download
#include <cstdio> // for printf()
#include <climits>
#define LENGTH 100 // bits
// reverse s[], knowing its length:
void reverse(char s[], int len);
// get the bits of x into bits[], return length of bits[] (no of bits):
template <typename T>
int bitstring (char bits[], T x);
int main()
{
char bits[LENGTH];
int i; long l; long long ll;
bitstring<int>(bits, 0);
printf ("0:\t\t%s\n", bits);
bitstring<int>(bits, CHAR_MAX);
printf ("CHAR_MAX:\t%s\n", bits);
bitstring<unsigned>(bits, UCHAR_MAX);
printf ("UCHAR_MAX:\t%s\n", bits);
bitstring<int>(bits, CHAR_MIN);
printf ("CHAR_MIN:\t%s\n", bits);
bitstring<int>(bits, -CHAR_MAX-1);
printf ("-CHAR_MAX-1:\t%s\n", bits);
bitstring<int>(bits, SHRT_MAX);
printf ("SHRT_MAX:\t%s\n", bits);
bitstring<unsigned>(bits, USHRT_MAX);
printf ("USHRT_MAX:\t%s\n", bits);
bitstring<int>(bits, SHRT_MIN);
printf ("SHRT_MIN:\t%s\n", bits);
bitstring<int>(bits, -SHRT_MAX-1);
printf ("-SHRT_MAX-1:\t%s\n", bits);
bitstring<int>(bits, INT_MAX);
printf ("INT_MAX:\t%s\n", bits);
bitstring<unsigned>(bits, UINT_MAX);
printf ("UINT_MAX:\t%s\n", bits);
bitstring<int>(bits, INT_MIN);
printf ("INT_MIN:\t%s\n", bits);
bitstring<int>(bits, -INT_MAX-1);
printf ("-INT_MAX-1:\t%s\n", bits);
bitstring<int>(bits, -1);
printf ("-1:\t\t%s\n", bits);
i = UINT_MAX; // -1 (modulo 2 arithmetic)
bitstring<int>(bits, i);
printf ("%d:\t\t%s\n", i, bits);
bitstring<long>(bits, LONG_MAX);
printf ("LONG_MAX:\t%s\n", bits);
bitstring<unsigned long>(bits, ULONG_MAX);
printf ("ULONG_MAX:\t%s\n", bits);
bitstring<long>(bits, LONG_MIN);
printf ("LONG_MIN:\t%s\n", bits);
bitstring<long>(bits, -LONG_MAX-1);
printf ("-LONG_MAX-1:\t%s\n", bits);
bitstring<long>(bits, -1l);
printf ("-1l:\t\t%s\n", bits);
l = ULONG_MAX; // -1l (modulo 2 arithmetic)
bitstring<long>(bits, l);
printf ("%ldl:\t\t%s\n", l, bits);
bitstring<long long>(bits, LLONG_MAX);
printf ("LLONG_MAX:\t%s\n", bits);
bitstring<unsigned long long>(bits, ULLONG_MAX);
printf ("ULLONG_MAX:\t%s\n", bits);
bitstring<long long>(bits, LLONG_MIN);
printf ("LLONG_MIN:\t%s\n", bits);
bitstring<long long>(bits, -LLONG_MAX-1);
printf ("-LLONG_MAX-1:\t%s\n", bits);
bitstring<long long>(bits, -1ll);
printf ("-1ll:\t\t%s\n", bits);
ll = ULLONG_MAX; // -1ll (modulo 2 arithmetic)
bitstring<long long>(bits, ll);
printf ("%lldll:\t\t%s\n", ll, bits);
return 0;
}
// reverse s[], knowing its length:
void reverse(char s[], int len)
{
int i = 0, j = len-1;
char temp;
while (i < j)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
// get the bits of x into bits[], return length of bits[] (no of bits):
template <typename T>
int bitstring(char bits[], T x)
{
int i = 0;
T mask = 01; // octal 1
while (mask != 0) // while(mask)
{
if ((x & mask) != 0) // if (x & mask)
{
bits[i++] = '1';
}
else {bits[i++] = '0';}
mask <<= 1; // mask = mask << 1;
}
bits[i] = '\0';
reverse(bits, i);
return i;
}
/*
g++ BitStrings.cpp -o BitStrings
./BitStrings
0: 00000000000000000000000000000000
CHAR_MAX: 00000000000000000000000001111111
UCHAR_MAX: 00000000000000000000000011111111
CHAR_MIN: 11111111111111111111111110000000
-CHAR_MAX-1: 11111111111111111111111110000000
SHRT_MAX: 00000000000000000111111111111111
USHRT_MAX: 00000000000000001111111111111111
SHRT_MIN: 11111111111111111000000000000000
-SHRT_MAX-1: 11111111111111111000000000000000
INT_MAX: 01111111111111111111111111111111
UINT_MAX: 11111111111111111111111111111111
INT_MIN: 10000000000000000000000000000000
-INT_MAX-1: 10000000000000000000000000000000
-1: 11111111111111111111111111111111
-1: 11111111111111111111111111111111
LONG_MAX: 0111111111111111111111111111111111111111111111111111111111111111
ULONG_MAX: 1111111111111111111111111111111111111111111111111111111111111111
LONG_MIN: 1000000000000000000000000000000000000000000000000000000000000000
-LONG_MAX-1: 1000000000000000000000000000000000000000000000000000000000000000
-1l: 1111111111111111111111111111111111111111111111111111111111111111
-1l: 1111111111111111111111111111111111111111111111111111111111111111
LLONG_MAX: 0111111111111111111111111111111111111111111111111111111111111111
ULLONG_MAX: 1111111111111111111111111111111111111111111111111111111111111111
LLONG_MIN: 1000000000000000000000000000000000000000000000000000000000000000
-LLONG_MAX-1: 1000000000000000000000000000000000000000000000000000000000000000
-1ll: 1111111111111111111111111111111111111111111111111111111111111111
-1ll: 1111111111111111111111111111111111111111111111111111111111111111
*/
Note: See also FloatBinary on the blog Thinking_in_C++_vol_1, Chapter_3 (The C in C++), Section Composite_Types.
Chapter_2 Exercise_2-5 getbits | BACK_TO_TOP | Exercise_2-6 |
Comments
Post a Comment