/* 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 );