Δημοσιεύτηκε: 28 Αύγ 2011, 14:57
Για τον φίλο Star_Light που από ότι κατάλαβα θέλει να μάθει πως διαχειρίζονται οι δυαδικοί αριθμοί με τη C, παραθέτω έναν απλό κώδικα που αρχικοποιεί ένα (unsigned) byte με την τιμή 2 ( = 00000010), το τυπώνει, ανάβει το 8ο bit και ξανατυπώνει τον αριθμό και τέλος σβήνει το 8ο bit ανάβει το 6ο και ξανατυπώνει τον αριθμό.
Η συνάρτηση void print_byte( const Byte byte ) τυπώνει το byte σε δυαδική, δεκαδική, δεκαεξαδική και οκταδική μορφή.
Η συνάρτηση char *s_byte2binary( char *s, const Byte byte ) μετατρέπει το byte σε δυαδικά ψηφία και τα αποθηκεύει στο s
Ως Byte έχω ορίσει ένα unsigned char, με το σχετικό typedef στην αρχή. Τα bitmasks BIT1, BIT2, ..., ΒΙΤ8 είναι οι δυνάμεις του 2 που αντιστοιχούν στο κάθε bit ενός byte: 2^0, 2^1, ... 2^7
Κάνοντας ένα byte | (OR) με ένα bitmask ανάβουμε το αντίστοιχο bit στο byte. Κάνοντας ένα byte & (AND) με το ~ (NOT) ενός bitmask, σβήνουμε το αντίστοιχο bit στο byte.
Οι τελεστές << και >> μετακινούν όλα τα bits του byte κατά μια θέση προς τα αριστερά και δεξιά, αντίστοιχα (π.χ. αν byte = 2, δλδ 00000010 τότε το: byte <<= 1; μετακινεί όλα τα bits μια θέση προς τα αριστερά, οπότε το byte θα γίνει ίσο με 4, δλδ 00000100)
Η συνάρτηση void print_byte( const Byte byte ) τυπώνει το byte σε δυαδική, δεκαδική, δεκαεξαδική και οκταδική μορφή.
Η συνάρτηση char *s_byte2binary( char *s, const Byte byte ) μετατρέπει το byte σε δυαδικά ψηφία και τα αποθηκεύει στο s
Ως Byte έχω ορίσει ένα unsigned char, με το σχετικό typedef στην αρχή. Τα bitmasks BIT1, BIT2, ..., ΒΙΤ8 είναι οι δυνάμεις του 2 που αντιστοιχούν στο κάθε bit ενός byte: 2^0, 2^1, ... 2^7
Κάνοντας ένα byte | (OR) με ένα bitmask ανάβουμε το αντίστοιχο bit στο byte. Κάνοντας ένα byte & (AND) με το ~ (NOT) ενός bitmask, σβήνουμε το αντίστοιχο bit στο byte.
Οι τελεστές << και >> μετακινούν όλα τα bits του byte κατά μια θέση προς τα αριστερά και δεξιά, αντίστοιχα (π.χ. αν byte = 2, δλδ 00000010 τότε το: byte <<= 1; μετακινεί όλα τα bits μια θέση προς τα αριστερά, οπότε το byte θα γίνει ίσο με 4, δλδ 00000100)
- Κώδικας: Επιλογή όλων
#include <stdio.h>
// Bitmasks
#define BIT1 1 // (1 << 0)
#define BIT2 2 // (1 << 1)
#define BIT3 4 // (1 << 2)
#define BIT4 8 // (1 << 3)
#define BIT5 16 // (1 << 4)
#define BIT6 32 // (1 << 5)
#define BIT7 64 // (1 << 6)
#define BIT8 128 // (1 << 7)
// Custom Types
typedef unsigned char Byte;
// ----------------------------------------------------------------------------------
char *s_byte2binary( char *s, const Byte byte )
{
if ( !s )
return NULL;
int z;
char *cp;
for (z=BIT8, cp=s; z > 0; z >>= 1, cp++)
*cp = (byte & z) == z ? '1' : '0';
*cp = '\0';
return s;
}
// ----------------------------------------------------------------------------------
void print_byte( const Byte byte )
{
char bin[8+1] = {0};
printf( "Bin: %s\t\tDec: %-3d\tHex: %-3x\tOct: %-3o\n",
s_byte2binary(bin, byte), byte, byte, byte );
return;
}
// ----------------------------------------------------------------------------------
int main( void )
{
Byte byte = 2; // αρχικοποίηση
print_byte( byte ); // τύπωμα αριθμού
byte |= BIT8; // άναμμα 8ου bit
print_byte( byte ); // τύπωμα αριθμού
byte &= ~BIT8; // σβήσιμο 8ου bit
byte |= BIT6; // άναμμα 6ου bit
print_byte( byte ); // τύπωμα αριθμού
return 0;
}