Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50

    [c] Operatori di shift per spostare n_bit di un char

    salve ...
    vorrei far ruotare di n_bit, verso sinistra o verso destra (rispettivamente di n_bit<0 e n_bit>0),
    il contenuto di una variabile char (mediante operatori bitwise).

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    char rotate(char ch,int n_bit);
    int main()
    {char ch,f;
    int n_bit;
     printf("quanti bit vuoi shiftare?:");
     scanf("%d",&n_bit);
     printf("inserisci il carattere ke vuoi far shiftare:");
     fflush(stdin);
     scanf("%c",&ch);
     f=rotate(ch,n_bit);
     printf("\nil risultato della rotazione: %c\n",f);
      system("PAUSE");	
      return 0;
    }
    char rotate(char ch,int n_bit)
    {char w;
    printf("digita 's' se vuoi shiftare a sinistra altrimenti 'd' a destra:\n");
    fflush(stdin);
    scanf("%c",&w);
    if(w=='s')
         return ch=w<<n_bit;
         else if(w=='d')
         return ch=w>>n_bit;
         }
    ho provato un pò ad implementarlo, ma credo che non ho incentrato bene il problema
    codice:
    code

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Considera che avendo un char, quindi solo 8 bits, quando fa uno shift (non un rotate) a sinistra, ti ritrovi tutti 0.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    quindi come potrei fare ruotare in modo che non perdo quei bit ke shifto??

    ad esempio
    ch=10111 rotate>di 2 ch=11101
    codice:
    code

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Supponendo che la rotazione debba essere, ad esempio, di 2 bit verso destra, quindi

    0 1 0 0 0 0 0 1 (A in ASCII)
    0 1 0 1 0 0 0 0

    (che poi equivale ad una rotazione di 8-2=6 bit verso sinistra), il problema fondamentale è che tu vai a perdere gli n bit (con n pari al valore dello shift) meno significativi, cioè se la prima configurazione di bit fosse stata semplicemente shiftata verso destra di due, il risultato sarebbe stato

    0 0 0 1 0 0 0 0

    questo lascia intendere che bisogna prima "salvare" quei due bit meno significativi (con una AND bitwise tra la variabile e un'apposita maschera binaria), poi fare lo shift normalmente della variabile di 2 verso destra e poi ancora andare a ripristinare quei 2 bit salvati facendo stavolta una XOR bitwise tra i due bit più significativi della configurazione ottenuta e appunto i 2 bit memorizzati.
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define n_len 32
    int ruotare (int,int,int,int);
    void bit_short(int,unsigned int[]);
    int numero,appoggio,bit_ruotare,verso;
    int main()
    {
    int k,bit[n_len],num;
    printf("inserisci il numero= ");
    scanf("%d",&numero);
    bit_short(numero,bit);
    printf("\t in binario:\n");
    for(k=0;k<n_len;k++)
    (k%4==0)?
    printf("  %d",bit[k]):printf("%d",bit[k]);
    printf("\ninserisci il verso da ruotare (destra=0),(sinistra=1): ");
    scanf("%d",&verso);
    printf("inserisci i numeri di bit da ruotare:");
    scanf("%d",&bit_ruotare);
    num=ruotare(numero,appoggio,bit_ruotare,verso);
    bit_short(num,bit);
    printf("\n in binario:\n");
    for(k=0;k<n_len;k++)
    (k%4==0)?
    printf("  %d",bit[k]):printf("%d",bit[k]);
    printf("\n");
    system("pause");
    }
    
    
    void bit_short(int numero,unsigned int bit[n_len])
    {
        short j;
        j=n_len-1;
        do{
        bit[j--]=numero&1;
        numero=numero>>1;
        }while (numero!=0 && j>=0);
        if(j>=0){
        do{
        bit[j--]=0;
        }
        while(j>=0);
        }
        }
    
    
    
    int ruotare (int numero,int appoggio,int bit_ruotare,int verso)
    {
    if (verso==0){
    appoggio=numero;
    numero=numero>>bit_ruotare;
    appoggio=appoggio<<(sizeof(int)*8)-bit_ruotare;
    numero=numero|appoggio;
    printf("il numero ruotato e'   %d",numero);
    }
    else{
    appoggio=numero;
    numero=numero<<bit_ruotare;
    appoggio=appoggio>>(sizeof(int)*8)-bit_ruotare;
    numero=numero|appoggio;
    printf("il numero ruotato e'   %d",numero);
    
    }
    return numero;
    }
    con gli int
    codice:
    code

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.