Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 19 Σεπ 2011, 09:41

Καλημέρα,
stamatiou έγραψε:@migf1 Αυτό τελικά είναι σωστό; http://forum.ubuntu-gr.org/viewtopic.php?p=207768#p207768

Δυστυχώς όχι.

Το κύριο πρόβλημά του είναι το λανθασμένο μέγεθος του πίνακα usedvals, το οποίο πρέπει να είναι maxvals+1, διότι στους παραγόμενους τυχαίους θέλουμε να περιλαμβάνεται και ο maxval, άρα ο πίνακας πρέπει να έχει θέσεις από 0 έως maxval (άρα συνολικό πλήθος: maxval+1).

Κατόπιν, στο do-while που ελέγχεις για τη μοναδικότητα του random, ελέγχεις για != TRUE (δηλαδή FALSE) ενώ πρέπει να ελέγχεις για == TRUE. Δηλαδή σε αυτό το loop θέλεις συνεχή παραγωγή τυχαίων, όσο οι παραγόμενοι τυχαίοι είναι μαρκαρισμένοι ως χρησιμοποιημένοι (TRUE) στον usedvals.

Έπειτα, εκείνο το if μέσα στο for και είναι περιττό και επαναλαμβάνεται χωρίς λόγο σε κάθε επανάληψη του for. Ότι έλεγχο ή διόρθωση θέλεις να κάνεις για το maxval πρέπει να τα κάνεις πριν ξεκινήσεις το βασικό σου for-loop.Παρεμπιπτόντως, επειδή πρέπει να ελεγχθεί η τιμή του maxval για να καθορίσει το μέγεθος του πίνακα usedvals, τον ορίζουμε ως δέικτη και όταν ελέγξουμε/διορθώσουμε την τιμή της maxval τον κάνουμε calloc() (και free() στο τέλος).

Ακόμα, δεν ενημερώνεις το τελικό table->buflen πριν τερματίσεις την συνάρτηση.

Και τέλος, υπάρχει μια περίπτωση που η συνάρτησή σου δεν δείχνει να λαμβάνει υπόψη της: όταν το buffer είναι μισογεμάτο πριν περαστεί στη συνάρτηση. Η λογική της συνάρτησής σου είναι να σβήνει τυχόν υπάρχουσες τιμές στα στοιχεία του buffer και να τις αντικαθιστά με τυχαίες.

Παραθέτω τον κώδικα της συνάρτησης που αντιμετωπίζει όλα τα παραπάνω...

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

/* --------------------------------------------------------------------------------
* Γεμίζει το buffer της δομής table με μοναδικές ψευδοτυχαίες τιμές από 0 έως maxval,
* ξεκινώντας από το πρώτο κενό στοιχείο του buffer.
* Σε περίπτωση επιτυχίας ενημερώνει το τρέχον μήκος του buffer στη δομή κι επιστρέφει
* TRUE. FALSE επιστρέφει όταν το buffer είναι ήδη γεμάτο ή δεν υπάρχει καν ή όταν το
* όρισμα table περαστεί στη συνάρτηση με τιμή NULL ή όταν δεν υπάρχει επαρκής
* ελέυθερη μνήμη για τη δημιουργία του προσωρινού πίνακα usedvals (τον χρειάζεται για
* να ελέγχει τη μοναδικότητα των παραγόμενων ψευδοτυχαίων τιμών).
* ΣΗΜΑΝΤΙΚΟ:
* Αν το όρισμα maxval είναι μικρότερο από το μέγιστο μήκος του buffer, τότε
* μετατρέπεται αυτόματα να είναι ίσο (αυτό είναι απαραίτητο για να μην μπαίνει
* σε ατέρμονο βρόγχο η παραγωγή των τυχαίων... π.χ. αν το μέγιστο μήκος του
* buffer είναι 12 στοιχεία και το maxval δοθεί με τιμή 10, μόλις γεμίσουν τα
* πρώτα 10 στοιχεία δεν υπάρχουν άλλοι μοναδικοί τυχαίοι για τα 2 στοιχεία
* που υπολείπονται).
* --------------------------------------------------------------------------------
*/
Bool table_fill_unique_randomly( Table *table, int maxval )
{
Bool *usedvals = NULL; /* για έλεγχο μοναδικότητας */
int tempval = 0; /* προσωρινός ψευδοτυχαίος */
register int i = 0; /* μετρητής για το buffer */

if ( !table ) /* έλεγχος ασφαλείας */
return FALSE; /* ... πρόωρη έξοδος αποτυχίας */

if ( !table->buffer ) /* το buffer δεν υπάρχει */
return FALSE; /* ... πρόωρη έξοδος αποτυχίας */

if ( table->buflen == table->bufmaxlen ) /* το buffer είναι γεμάτο */
return FALSE; /* ... πρόωρη έξοδος αποτυχίας */

if (maxval < table->bufmaxlen - table->buflen ) /* είναι το maxval πολύ μικρό? */
maxval = table->bufmaxlen - table->buflen; /* διόρθωσέ το */

usedvals = calloc( maxval+1, sizeof(int) ); /* δημιουργία maxval+1 θέσεων */
if ( !usedvals ) /* αποτυχία δημιοργίας */
return FALSE; /* ... πρόωρη έξοδος */

for (i=table->buflen; i < table->bufmaxlen; i++)/* γέμισμα buffer με τυχαίους */
{ /* ... */
do { /* ... συνεχής */
tempval = rand() % (maxval + 1);/* ... παραγωγή τυχαίου */
} while ( usedvals[ tempval ] == TRUE );/* ... μέχρι να είναι μοναδικός*/
/* ... */
table->buffer[i] = tempval; /* αποδοχή ττυχαίου στο buffer */
usedvals[ tempval ] = TRUE; /* χαρτγράφησή του ως used */
}

table->buflen = table->bufmaxlen; /* ενημέρωση τρέχοντος μήκους */

if ( usedvals ) { /* έλεγχος ασφαλείας */
free( usedvals ); /* ... αποδέσμευση μήμης */
usedvals = NULL; /* ... καλού-κακού */
}

return TRUE; /* επιστροφή επιτυχίας */
}


ΥΓ. Τις συναρτήσεις που φτιάχνεις γιατί δεν τις δοκιμάζεις πρώτα για να δεις αν δουλεύουν σωστά με διάφορα test-cases;
Τελευταία επεξεργασία από migf1 και 19 Σεπ 2011, 09:43, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 19 Σεπ 2011, 09:42

Garrus έγραψε:Μπορει καποιος να με βοηθησει/λινκαρει στο θεμα της οργανωσης των αρχειων πηγαιου κωδικα; (.c , .h)
Ειχα συνηθισει να γραφω την main σε ενα .c και ολες τις σχετικα "ασχετες" συναρτησεις σε .h αρχεια.

Για πες πόσα αρχεία .c έχεις και ποια είναι τα ονόματά τους.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 19 Σεπ 2011, 09:44

stamatiou έγραψε:@migf1 Εγώ τώρα όμως που μπερδεύτηκα ποια από όλες τις ασκήσεις να πρωτολύσω;

Μπορείς να δοκιμάσεις αυτήν εδώ: viewtopic.php?p=208094#p208094
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Garrus » 19 Σεπ 2011, 16:39

έγραψε:Για πες πόσα αρχεία .c έχεις και ποια είναι τα ονόματά τους.

Δεν ρωταω συγκεκριμενα, αλλα γενικα.Δεν λυνω καποια ασκηση.


Καπου σε ενα αλλο νημα ειχα δει πως τα .h ουσιαστικα δεν περιεχουν τον κωδικα που θελεις να συμπεριλαβεις, αλλα μονο τις δηλωσεις των συναρτησεων.
Γιατι;
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 19 Σεπ 2011, 18:32

Garrus έγραψε:
έγραψε:Για πες πόσα αρχεία .c έχεις και ποια είναι τα ονόματά τους.

Δεν ρωταω συγκεκριμενα, αλλα γενικα.Δεν λυνω καποια ασκηση.


Καπου σε ενα αλλο νημα ειχα δει πως τα .h ουσιαστικα δεν περιεχουν τον κωδικα που θελεις να συμπεριλαβεις, αλλα μονο τις δηλωσεις των συναρτησεων.
Γιατι;

Τα .h περιέχουν ορισμούς δομών, ενώσεων, τύπων απαρίθμησης, πρόσθετους τύπους δεδομένων, καθολικές μεταβλητές, macros, preprocessor directives και πρότυπα συναρτήσεων, που τα θέλεις να είναι κοινά σε περισσότερα από ένα .c αρχεία.

Α, και αν δεν δουλεύεις σε IDE, θα πρέπει να φτιάξεις κι ένα makefile για το compilation των .c αρχείων σε ένα εκτελέσιμο.

Θα ήταν πολύ πιο εύκολο αν παρέθετες κάποιο ζωντανό παράδειγμα με πιο συγκεκριμένες ερώτήσεις.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Garrus » 19 Σεπ 2011, 18:54

οκ πχ σε ενα προβλημα οπου απαιτουνται λιστες και κομβοι θα εγραφα:
program.c file
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include "lists.h"

int main(void){
//blah blah

}


lists.h file

Κώδικας: Επιλογή όλων
struct node{
// elements
}
struct node foo(){
//blah blah
}

...
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 19 Σεπ 2011, 19:23

Garrus έγραψε:οκ πχ σε ενα προβλημα οπου απαιτουνται λιστες και κομβοι θα εγραφα:
program.c file
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include "lists.h"

int main(void){
//blah blah

}


lists.h file

Κώδικας: Επιλογή όλων
struct node{
// elements
}
struct node foo(){
//blah blah
}

...

Όχι, στο list.h δεν βάζουμε ορισμούς συναρτήσεων, μονάχα τα πρότυπά τους.

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

// ========================================================
// File: list.h
// ========================================================

/* Πρόσθετοι Τύποι Δεδομένων */

typedef struct list {
...
} List;

/* Πρότυπα Συναρτήσεων */

#ifndef _LIST_C_ // εξαίρεση από το: list.c
extern List *list_new( ... );
#endif

#ifndef _MAIN_C_ // εξαίρεση από το: main.c
extern void foo( ... );
#endif


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

// ========================================================
// File: list.c
// ========================================================

#define _LIST_C_ // χρησιμοποιείται στο: list.h

#include "list.h"

List *list_new( ... ) // ορισμός της foo()
{
...
foo( ... ); // η foo() έχει οριστεί στο: main.c
}

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

// ========================================================
// File: main.c
// ========================================================

#define _MAIN_C_ // χρησιμοποιείται στο: list.h

#include <stdio.h>
#include "list.h"

// ------------------------------------------------------------------------
void foo( ... ) // ορισμός της foo()
{
...
}
// ------------------------------------------------------------------------
int main( void )
{
List *list = NULL;

list = list_new( ... ); // η list_new() έχει οριστεί στο list.c
...
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 20 Σεπ 2011, 19:36

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

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

"Οι θέσεις που αδειάζουν , θα γεμίσουν με μηδενικά && τα μηδενικά που μετακινούνται πέραν του δεξιού τέλους (σε μια δεξιά ολίσθηση) του αριστερού τελεστέου θα χαθούν" (συμβαίνουν και τα 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!!!!
Τελευταία επεξεργασία από Star_Light και 20 Σεπ 2011, 20:03, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 20 Σεπ 2011, 20:02

Λάθος 1ο. Η αρίθμηση ξεκινά απο 0 και οχι απο 1. Το διόρθωσα :D

έχει ή δεν έχει σημασία αν την αρίθμηση θα την ξεκινήσεις απο 0 ή 1 σε μια δυαδική ακολουθία ως προς τις θέσεις?

Τι λέτε ?
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 20 Σεπ 2011, 21:39

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

Καλησπέρα :)

Πολύ μπλεγμένο το βρήκα το κείμενο. Το bit shifting ολισθαίνει προς τα δεξιά ή αριστερά τόσα bits του 1ου όρου της πράξης, όσα δηλώνει ο 2ος όρος (κόβοντας όσα bits βγαίνουν εκτός ορίων προς την κατεύθυνση του shifting, γεμίζοντας παράλληλα με μηδενικά bits τον χώρο που δημιουργείται στο αντίθετο άκρο).

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

10010011 >> 2

ολισθαίνει τον 1ο όρο της πράξης 2 bits προς τα δεξιά (που σημαίνει πως κόβει τα 2 τελευταία bits και προσθέτει ισάριθμα μηδενικά bits στην αρχή ) δίνοντας ως αποτέλεσμα:
Κώδικας: Επιλογή όλων

00100100


Με την ίδια λογική, αλλά ανάποδα, το ...
Κώδικας: Επιλογή όλων

10010011 << 3

ολισθαίνει τον 1ο όρο της πράξης 3 bits προς τα αριστερά (που σημαίνει πως κόβει τα 3 πρώτα bits και προσθέτει ισάριθμα μηδενικά bits στο τέλος ) δίνοντας ως αποτέλεσμα:
Κώδικας: Επιλογή όλων

10011000


Άσχετα με το bit-shifting, κάθε bit αντιστοιχεί σε μια δύναμη του 2, αλλά ανάλογα την αρχιτεκτονική της εκάστοτε πλατφόρμας μετριέται είτε από δεξιά είτε από αριστερά. Αν υποθέσουμε πως μετριέται από αριστερά προς τα δεξιά, τότε το 1ο αποτέλεσμα σε δεκαδική απεικόνιση δίνει το νούμερο...
Κώδικας: Επιλογή όλων

decimal(00100100) = 0*(2^0) + 0*(2^1) + 1*(2^2) + 0*(2^3) + 0*(2^4) + 1*(2^5) + 0*(2^6) + 0*(2^7) = 2^2 + 2^5 = 4 + 32 = 36

Κάντε εσείς τις πράξεις στο 2ο αποτέλεσμα ;)

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

Τι σχέση έχει τώρα η memset() ωρέ :lol: :lol: (τι μανία είναι αυτή ρε συ να μπερδεύεις άσχετα πράγματα μεταξύ τους :( )

ΥΓ. Τα bit-shifts μπορούν να χρησιμοποιηθούν για γρήγορο πολλαπλασιασμό (αριστερό shift) ή διαίρεση (δεξί shift) ενός αριθμού με πολλαπλάσια του 2
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι