0
votes

Problème dans la compréhension de la fonction décimale à la fonction binaire avec des opérateurs bitwises en C ++

Comment cette fonction change décimal à binaire?
Je sais quelle opération bitwise fait mais je ne comprends pas ce que cette fonction fait dans le travail xxx


3 commentaires

Pour le négatif A, la valeur d'A >> 1 est définie par la mise en œuvre.


Vous avez besoin de google quelques points. "Tajuste gauche et droite", "Bitwise et et ou" et "Récursion".


Vous devez cibler ce que vous ne comprenez pas dans cette fonction: les opérations bitwises ( <<< / code> et & )? La récursion de fonction ? Autre chose?


3 Réponses :


3
votes

fonction récursive xxx

exemple xxx


0 commentaires

3
votes
void function(unsigned int a);
//            ^^^^^^^^

0 commentaires

4
votes
// Step 1: You call a function defined as `void function(int a)`
// which accepts one parameter of type int and returns a void.
void function(int a)
{
    // Step 2: This function checks if a is zero or some other value. 
    // If it is zero, nothing happens and the function returns.
    // If it is non-zero, we proceed inside the if block.
    if(a){
        // Step 3: we do two things here.
        // First we right-shift whatever value is stored in a.
        // Right-shifting means if we have e.g. a=8, which is 1000 in binary,
        // then rightshifting 8 would be 0100 or 4. Basically it is division by 2.
        // This continues until we have 0000.

        // Secondly, this function will call itself then. This is called recursion.
        // So the "void function(4)-> void function(2) -> void function(1)" calls will run.
        function(a>>1);

        // Here we will bitwise AND with 1.
        // So, 0001 & 0001 = 1
        // 0010 & 0001 = 0
        // 0100 & 0001 = 0
        // 1000 & 0001 = 0
        // And this is what you will see on the terminal as output: 1000
        // The 1 gets printed first, because the inner most call in the recursion
        // finishes first and the call stack unwraps back up.
        cout<<(a&1);
    }
}

6 commentaires

'Tout d'abord, nous passons à droite' - c'est peut-être ambivalent; Si vous avez dû réécrire la fonction uniquement sur la base de cette explication, je ferais a >> = 1; FA); STD :: COUT << (A & 1) .


@Op, pour éviter les problèmes, mentionné pour le cas de nombres négatifs, je changerais si (a) par si (a> 0) .


@Aconcagua, fais-vous référence à "6.2.2 Ordre d'évaluation [Expr.evaluation]"? J'ai toujours pensé que l'opération serait effectuée en premier avant que l'appel de la fonction continue. N'est-ce pas le cas? Sinon, alors apparemment, j'ai appris quelque chose de nouveau aujourd'hui.


Votre compréhension va bien, le point est: votre libellé pourrait être mal compris. Assurez-vous que la valeur d'abord est décalée à droite, alors est transmise à la fonction - pour être plus précis: le résultat du décalage est passé - WHERAS L'opérande A reste inchangé. 'Tout d'abord, nous devons-nous-là Je comprendrais, contrairement à modifier également l'opérande, comme dans F (a >> = 1) (note le = ).


En dehors de: il est totalement légal du changement de vitesse 0 (pas d'UB du tout)! 0 >> 1 reste juste 0 ...


Merci. Édité comme suggéré. En effet. Je me confondis à nouveau avec les chiffres négatifs, que certaines personnes avaient souligné, mais dans un contexte différent.