Προγραμματιστική πρόκληση Νο 9

Και τώρα κάτι διαφορετικό για τις μέρες καραντίνας. Τι κάνει ο παρακάτω κώδικας ;

int wtf(int a, int b) {
    int sum = 0;
    while (a != 0) {
        if ((a & 1) != 0)
            sum += b;
        b = ( b << 1);
        a = ( a >> 1);
    }
    return sum;
}

Για την λύση θα πρέπει να σκεφτείς σαν μια CPU και με 0 και 1.

Η πράξη (b << 1) κάνει ολίσθηση bit και η πράξη (a & 1) είναι το δυαδικό KAI/AND. Η γλώσσα είναι η C αλλά πιστεύω μπορείς να βγάλεις άκρη και χωρίς την γνώση της γλώσσας.

  • Τι κάνει ο κώδικάς;
  • Δουλεύει με μηδενικούς αριθμούς;
  • Δουλεύει με αρνητικούς αριθμούς;

Αν βρείτε τις απαντήσεις ή ξέρετε τον αλγόριθμο πείτε την λύση με προσωπικό μήνυμα το οποίο θα δημοσιευτεί εδώ κάποια στιγμή, αν έχει δημοσιευτεί ήδη μην στείλετε PM. Ερωτήσεις και διευκρινήσεις εδώ δημόσια. Δεκτές και υλοποιήσεις σε άλλες γλώσσες.

Βοηθάει να μετατρέψεις δυο αριθμούς σε δυαδικό σύστημα στα 8bit και να τρέξεις τον αλγόριθμό στο χαρτί

Για όσους θέλουν να δουν τον κώδικα σε ένα πλήρες πρόγραμμα

Μην τρέξετε το πρόγραμμα πριν προσπαθήσετε στο χαρτί

#include <stdio.h>

int main() {
    int a= 42;
    int b = 11;
    int sum = 0;
    while (a != 0) {
        if ((a & 1) != 0)
            sum += b;
        b = ( b << 1);
        a = ( a >> 1);
    }
    printf("sum: %d\n", sum);
}

2 Likes

Έχουμε την πρώτη σωστή απάντηση από τον @christ0s

Επί της ουσίας η πράξη (b << 1) διαιρεί το b δια δύο, ενώ το ( a >> 1) διπλασιάζει το a ;
Δεν έχω χρησιμοποιήσει ποτέ δυαδικούς τελεστές και πάντα με μπερδεύουν όταν τους συναντώ.

H ολίσθηση αριστερά προθέτει μηδενικά στο τέλος και έτσι θα φτιάξει μεγαλύτερο αριθμό, ενώ η ολίσθηση δεξιά προσθέτει στην αρχή και καταργεί το στοιχείο στο τέλος. Οπότε τα είπες ανάποδα. Αλλά με μια προϋπόθεση: ο αριθμός είναι είτε χωρίς πρόσημο, είτε είναι θετικός αριθμός.