Δημοσιεύτηκε: 28 Αύγ 2011, 15:20
από Star_Light
migf1 έγραψε:Για τον φίλο 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)

Κώδικας: Επιλογή όλων

#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;
}


1.α ωραιοτατα. Ευχαριστω. Το 2 το δινεις ετσι 00000010 αλλα και ολα τα μηδενικα να βγαλεις απο αριστερα παλι 2 θα μεινει λογω προσθηκης στα λιγοτερο σημαντικα bit απο αριστερα. Για 1 δευτερολεπτο μπερδευτηκα αλλα μονο για 1 :P . Λοιπον θα δω αυτο τον κωδικα... προ λιγου καπου πηρε το ματι μου και τον αλγοριθμο του καισαρα που ουσιαστικα αναλογα με το κλειδι κανεις μετατοπισεις μεσα στον πινακα πχ αν το κλειδι ειναι 3 τοτε ο αρχικος χαρακτηρας (1ος) στο κρυπτοκειμενο θα ειναι ο 4ος του αρχικου απλου κειμενου κ.ο.κ . Αφου διαβασω αυτα που εδωσες θα κοιταξω να φτιαξω και καναν καισαρα μετα να χαρω λιγο.

2. (Λιγο ασχετη απορια) αλλα αν σε εναν hex editor οπου τα data αντιπροσωπευονται απο 16-δικες τιμες και ομαδοποιούνται σε 4 groups των 4 bytes τοτε απο αυτα τα 4 καθε φορα παιρων 2 χαρακτηρες? ΕΦοσον 1 char δινει 8 bytes.