Δημοσιεύτηκε: 20 Σεπ 2011, 19:36
από Star_Light
Παιδιά σήμερα έπεσε το μάτι μου στις ολισθήσεις τις οποιες είχα προσπαθήσει και παλαιοτερα να καταλάβω αλλα χωρις μεγάλη επιτυχία. Σήμερα ομως αφιέρωσα ενα μισαωράκι και τις κατανοησα πληρως (νομίζω) θα παραθέσω εδω την δεξιά ολίσθηση για όποιον την προσπαθεί και δεν την έχει κατανοήσει και στο ίδιο μοτιβο κινείται και η αριστερή. Δεν θα μπω στην διαδικασία να ξαναγράψω αυτα που λένε τα βιβλια αφενος διοτι ο καθένας μπορει να τα διαβάσει και αφετέρου επειδη αυτο το ποστ αναφέρεται σε οσους οπως προανέφερα (μέσα στους οποίους άνηκα και εγω) έκαναν μια προσπάθεια να την καταλάβουν απο τον αρχικό ορισμό αλλα τίποτα... μολις διαβάσουν το συγκεκριμένο ποστ παλι θα ανήκουμε στην ίδια ομάδα αλλα αυτη τη φορα θα έχουν κατανοήσει και αυτοι την δεξιά ολίσθηση (οπως αλλωστε τωρα και εγω!!) .

Δεξιά Ολίσθηση

"Οι θέσεις που αδειάζουν , θα γεμίσουν με μηδενικά && τα μηδενικά που μετακινούνται πέραν του δεξιού τέλους (σε μια δεξιά ολίσθηση) του αριστερού τελεστέου θα χαθούν" (συμβαίνουν και τα 2 μαζι για αυτο και ο τελεστής && ) :D

Καταρχήν εφοσον θα ασχοληθούμε με την δεξιά ολίσθηση μας ενδιαφέρει η "ροή" προς τα δεξιά αρα αυτοματα μας ενδιαφέρει το δεξιό άκρο στην ακολουθία (οχι πως το αριστερό δεν θα μας νοιάξει αλλα θα αναφερθώ σε λίγο)

Έστω οτι έχω να ολισθήσω την

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


προς τα δεξιά και κατα 2

τοτε ουσιαστικά ψάχνω το αποτέλεσμα αυτου =>

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


Τωρα εδώ ο αριστερός τελεστέος ειναι η ίδια η ακολουθία , οποιος λοιπον δεν κατάλαβε πανω πανω πως έμπλεξα ταυτόχρονα τις φράσεις "δεξιό τέλος" και "αριστερός τελεστέος" τωρα μπορει να καταλάβει τι ήθελα να πω.

Αρχικά αριθμώ θεσιακά την ακολουθία μου. (Ως προς την θέση των bit δηλαδη )


Πρίν την ολίσθηση


Κώδικας: Επιλογή όλων
1 0 0 0 1 0 1 0
p0 p1 p2 p3 p4 p5 p6 p7

// pn => position n οπου n = 1,2,3 ....


Υλοποίηση Ολίσθησης

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


p0 -> p2
p1 -> p3
p2 -> p4
p3 -> p5
p4-> p6
p5-> p7


Μετά δηλαδη την ολίσθηση η θέση p1 γίνεται p3 δηλαδή το bit που υπήρχε στην 0 θα αντιστοιχεί στην θέση 2 μετα την ολίσθηση
κ.ο.κ (για το συγκεκριμένο παράδειγμα) , αν σε κάποιο άλλο παράδειγμα ήθελα να ολισθήσω κατα 5 ας πουμε τοτε θα είχα
οτι η θέση p0 γίνεται p5 η θέση p1 γίνεται p6 η p2 γίνεται p7 ενω οι θέσεις {p0,p1,p2,p3,p4} γεμίζουν με μηδενικά

με πρόσθετες παρατηρήσεις ότι

1. Οι θέσεις που αδειάζουν (p0 , p1 ) θα γεμίσουν με μηδενικά.

&&

2. Τα δυαδικά που θα μετακινηθούν μετα το πέρας (απο τα δεξιά της αρχικής δυαδικής) ξεχάστε τα γιατι χάνονται.

Σύμφωνα και με τα παραπάνω λοιπον η τελική δυαδική μετα την ολίσθηση θα είναι :

Κώδικας: Επιλογή όλων
0 0 1 0 0 0 1 0
p0 p1 p2 p3 p4 p5 p6 p7


Oμοίως δουλεύει και η αριστερή.

Και ενας απλοικός κώδικας που υλοποιεί τα παραπάνω.

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


#include<stdio.h>

int main()

{

int x , y , r1 , r2;
r1=0;
r2=0;

printf("Dwste to x: ");
scanf("%d", &x);
printf("Dwste to y: ");
scanf("%d", &y);

r1=x>>y;

puts("\n");

printf("To apotelesma tis deksias olis8isis kata y einai : %d",r1);
puts("\n");

r2=x<<y;

printf("To apotelesma tis daristeris olis8isis kata y einai : %d",r2);



return 0;
}


P.S Παρακαλείται ο κύριος migf1 όποτε βρει χρόνο να ελένξει αυτά που έχω γράψει :lol: :lol:

P.S2 Η memset στην C που γεμίζει την μνήμη με μια τιμή και στην προκειμένη θα γεμίσει τις κενές θέσεις αυτες δηλαδη που αδειάζουν με 0!!!!