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

Popular posts from this blog

Contents

Blogger Page Margins in Contempo