3.2.1
Visa en funktion int pack( unsigned short year, unsigned short month, unsigned short day)
som packar tre heltal representerande år, månad och dag, i ett heltal som returneras.
Det returnerade heltalet ska packas enligt enligt följande figur
int pack( unsigned short year, unsigned short month, unsigned short day) { unsigned int rval = year << 9; rval |= month << 5; rval |= day; return rval; }
int countones( unsigned int val) { int retval = 0; while(val) { if( val & 1 ) retval++; val >>= 1; } return retval; }
int bitcheck( unsigned int val) { int retval = 0; while(val) { if( val & 1 ) retval++; val >>= 1; } return retval & 1; }
int countones( unsigned int val) { /* Vi räknar antalet ettor och subtraherar dessa från ordlängden */ int retval = 0; while(val) { if( val & 1 ) retval++; val >>= 1; } return (sizeof(int)*8) - retval; }
unsigned int bitconvert(int method, unsigned int value) { unsigned int rv; switch( method & 3 ) { case 0: rv = value; break; case 1: rv = ( value ^ 0xFFFFFFFF ); break; // or rv = ~value; case 2: rv = ( value >> 16 ); break; case 3: rv = ( (value >>8) & 0xFFFF); if (rv & 0x8000 ) rv = (rv | 0xFFFF0000 ); break; } return rv; }
3.2.6
Bitwise OR används typiskt för att ett-ställa bitar.
Bitwise AND används typiskt för att nollställa bitar.
Bitwise XOR används typiskt för att invertera bitar.
Du måste vara bekväm med att översätta fram och tillbaks mellan decimala, hexadecimala och binära talsystemet. (Oktala talsystemet används sällan nu för tiden.) Du måste behärska AND, OR, XOR, <<, >> och ~ (not).
void printBinary(unsigned char byte)
som tar en char
som parameter och skriver
ut denna på binär form, dvs. 1:or och 0:or. T ex
00001001 för
byte = 9.
#include <stdio.h> #include <string.h> void printBinary(unsigned char byte) { for(int i=7; i>=0; i--) { int bit = (byte >> i) & 0x01; printf("%d", bit); } } int main() { unsigned char byte = 128; printBinary(byte); return 0; }
#include <stdio.h> #include <string.h> void printDecimal(char str[]) { unsigned char byte = 0; for(int i=0; i<8; i++) { if(str[i] == '1') byte |= (1<<(7-i)); } printf("%d", byte); } int main() { char str[] = "00001001"; printDecimal(str); return 0; }
#include <stdio.h> int main() { unsigned char byte = 128; printBinary(byte); printf("\n"); byte |= (1<<1 | 1<<3 | 1<<5); printBinary(byte); printf("\n"); printf("%d\n", byte); return 0; }
x ^= 0xff; x++;
#include <stdio.h> #include <string.h> #include <unistd.h> //(eller <windows.h>) void printBinary(unsigned short tal) { for(int i=15; i>=0; i--) { int bit = (tal >> i) & 0x01; printf("%d", bit); } } void clearscreen() { for(int i=0; i<80; i++) printf("\n"); } int main() { while (1) { unsigned short a = 0x8000, b = 0x0001; for(int i=0; i<15; i++) { clearscreen(); a >>= 1; b <<= 1; printBinary(a | b); printf("\n"); // without the sleep, the eternal loop may // also cause the program to be harder to // terminate. usleep(250000); // för Windows: Sleep(250); } } return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> // för abs() #include <unistd.h> //(eller <windows.h>) ... void printSpaces(int n) { for(int i=0; i<n; i++) printf(" "); } int main() { unsigned short a = 1, b = 0x8000; int scrollWidth = 50; int loopIter = 0; while (1) { clearscreen(); // Hantera horisontell bouncing scroll // låt scrolliter loopa runt från 0 t.om. 99; int scrollIter = loopIter % (2*scrollWidth); int pos = 35 + scrollWidth - abs(scrollWidth - scrollIter); printSpaces(pos); // hantera bit-scroll if((loopIter % 2) != 0) { // uppdatera bitmönstret endast varannan iteration. a = (a <= 1) ? 0x8000 : a >> 1; b = (b == 0x8000) ? 0x0001 : b << 1; } printBinary(a | b); printf("\n"); usleep(33333); loopIter++; } return 0; }
#include <math.h> //för fabs(), sin() ... // Hantera horisontell bouncing scroll ... // hantera bit-scroll ... // Hantera vertikal studs float t = (loopIter % 41) / 40.0f; // t: 0 -> 40 float y = 10.3f*( fabs(2*(3*t*t - 2*t*t*t) -1)); // ser bättre ut än // en ren t^2-kurva for(int i=0; i<y; i++) printf("\n");