/* bitops1.c
Einige Bitfunktionen
Enthaelt auch die Loesung der Aufgaben
8.6 (andere Richtung), 8.7 (ohne Vorzeichen) des C-Buches
Das niederwertigste Bit hat die Nummer 0 !
*/
#include <stdio.h>
#include "bitops1.h"
/* positive Dualzahl lesen */
t_bitmuster DualIn(void)
{
t_bitmuster z = 0;
int c;
printf("Dualzahl ? ");
c = getchar();
while ((c == '0') || (c == '1')) {
z <<= 1;
z += c - '0';
c = getchar();
}
return z;
}
/* Binaerdarstellung des Wertes z */
void DualOut(t_bitmuster z, char endchar)
{
t_bitmuster maske = 0;
int n;
n = 8*sizeof(t_bitmuster)-1; /* 31, 15, 7 */
maske = 1 << n;
for (; n >= 0; n--) {
putchar(z & maske ? '1' : '0');
if (n % 8 == 0) putchar(' ');
maske >>= 1;
}
putchar(endchar);
}
/* nach Links schieben mit Uebertrag des hoechstwertigen Bits
zum niederwertigsten Bit */
void CircleShiftLeft( t_bitmuster *z, int n)
{
int LeftBit;
for (; n > 0; n--) {
LeftBit = (1 << 8*sizeof(t_bitmuster)-1) & *z ? 1 : 0;
*z <<= 1;
*z += LeftBit;
}
}
/* Bit Nr. n testen */
int TestBit( t_bitmuster z, int n)
{
return (1 << n) & z ? 1 : 0;
}
/* bitops1test.c Testumgebung zu einigen Bitfunktionen */
#include <stdio.h>
#include "bitops1.h"
int main()
{
t_bitmuster a;
a = DualIn();
while (a != 0) {
DualOut(a, '\n');
{
int i;
printf("Mehrmals nach links schieben\n");
for (i = 0; i < sizeof(t_bitmuster) * 8; i++) {
CircleShiftLeft(&a, 1);
DualOut(a, '\n');
}
printf("Um 7 Positionen nach links schieben\n");
CircleShiftLeft(&a, 7);
DualOut(a, '\n');
for (i = sizeof(t_bitmuster) * 8 - 1; i >= 0; i--)
printf("%1i", TestBit(a, i));
}
printf("\n\n0 beendet den Test\n");
a = DualIn();
}
return 0;
}
/* bitops1.h */
typedef unsigned char t_bitmuster;
t_bitmuster DualIn (void);
void DualOut (t_bitmuster z ,char endchar );
void CircleShiftLeft (t_bitmuster * z ,int n );
int TestBit (t_bitmuster z ,int n );