Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-04-2007, 16:54   #1
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
[C] Estrazione bit

Salve, stavo provando a fare 1 esercizio ma mi risulta un po difficile, potreste aiutarmi? (scusate se rompo di nuovo)

La traccia è:

Scrivere 1 function C per estrarre dalla variabile intera A i k bit più o meno significativi dove k e A sono parametri di input usando (1) una maschera opportuna; (2) una maschera e operatori di shif (<< o >>)

Già di per se la traccia non mi era chiara perchè la maschera non ho capito cos'è, poi per quanto riguarda l'estrazione nemmeno ho capito, cioè diciamo che io in input do' 4 in binario sarebbe

00000000.00000000.00000000.00000100

per estrarre i 3 piu' significativi devo estrarre questo in grassetto?

00000000.00000000.00000000.00000100?

e le meno significative devo estrarre questo?

00000000.00000000.00000000.00000100?

E che si intende per estrazione? Devono essere visualizzate solo quelle 3 cifre? Mi spieghereste pure cos'è una maschera? Scusate ma dalle slide della prof non si capisce
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 17:52   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
La maschera è un intero che rappresentato in binario ha un 1 in tutti i bit che vuoi estrarre, ed uno 0 negli altri bit...

Se sai l'aritmetica binaria saprai che utilizzando l'and fra la maschera ed i dato, il risultato sarà composto da tutti zero dove la maschera ha zero e il valore del dato dove la maschera ha gli uno...

I K bit meno significativi sono i K più a destra (nella notazione classica), i K più significativi sono i K più a sinistra...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2007, 18:39   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
per estrarre i 3 piu' significativi devo estrarre questo in grassetto?

00000000.00000000.00000000.00000100?

e le meno significative devo estrarre questo?

00000000.00000000.00000000.00000100?
No no. Dato un numero a N bit, il bit più significativo è quello più a sinistra (il bit N-1) e il meno significativo è quello più a destra (il bit 0).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 03:33   #4
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
ahhh, ok, capito, era piu' facile di quello che pensavo, credevo fosse chissà quale mostruosa cosa...

cmq ho scritto un po' il codice ma non va...

mi da sempre lo stesso risultato X=65356

sara' per colpa di questo forse
5 n:\ciisem~1\lv1\4masch~1\maschera.c
warning: return type of `main' is not `int'

Codice:
#include <stdio.h>
int PIU_SIGNIFICATIVI(int A,int k);
int MENO_SIGNIFICATIVI(int A,int k);
void main()
{
     int A,k,X;
     short scelta;

     puts("Digita un valore A");
     scanf("%d,&A");

     puts("Digita quanti bit vuoi estrarre (max 32)");
     scanf("%d,&k");

     puts("Digita se estrarre i bit piu' significativi o meno significativi");
     puts("Piu' significativi [0]");
     puts("Meno significativi [1]");

     scanf("%ld,&scelta");

     while ((scelta==0 || scelta==1))
     {
     puts ("Scelta errata, riprovare");
     scanf("%ld,&scelta");
     }

     if (scelta==0)
     X=PIU_SIGNIFICATIVI(A,k);

     else if (scelta==1)
     X=MENO_SIGNIFICATIVI(A,k);

     printf("Risultato X=%d\n",X);
     system("pause");
}

int PIU_SIGNIFICATIVI(int A,int k)
{
   int mask;
   short i;

   //Creazione maschera
   for (i=1;i<k;i++)
   mask=mask*2;
   mask--;

   mask<<(sizeof(int)*8-k);

   return mask&A;
}

int MENO_SIGNIFICATIVI(int A,int k)
{
     short b;
     int mask=0;

     for(b=1;b<=k;b++)
     mask=mask<<1|1;
     return mask&A;
}
manco il while va, esce il risultato qualsiasi numero metto
consigli?
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 05:04   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
- per quanto riguarda il ciclo while, quello che hai scritto, in sintesi e': "se i dati sono corretti, ritenta". Probabilmente intendevi il contrario (a meno ovviamente di una svista mia);

- Sarebbe meglio (ma e' solo un parere personale) se il bit meno significativo fosse 0 e non 1. Questo per due motivi:
1 - e' piu' semplice;
2 - fanno tutti cosi', per cui e' quello che ci si aspetta;

- Il codice per MENO_SIGNIFICATIVI sembra OK. Il codice per PIU_SIGNIFICATIVI e' particolarmente strano. E' quello che non funziona?
In piu' non hai inizializzato la mask, per cui il risultato sara' comunque indeterminato.
Suggerimento: fai la stessa cosa di MENO_SIGNIFICATIVI, inizializzi la variabile mask a 0x80000000 e poi shift a destra


Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 09:52   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
mask<<(sizeof(int)*8-k);
Questo operazione non fa niente dato che non hai assegnato il risultato...
Inltre: mask=mask*2 equivale a fare: mask = mask << 1;

Le maschere le puoi creare con gli shift...

Data una maschera (che può avere già dei bit a 1) per aggiungere un 1 in una posizione qualsiasi devi fare lo shift sinistra del numero 1 di N posizioni corrispondenti al bit che vuoi a 1 e poi fare un or con la maschera...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 15:30   #7
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
grazie per gli aiuti, ho aggiustato il while, e per quanto riguarda sempre lo stesso risultato, avevo sbagliato un " nelle scanf (il compilatore mi sa che è vecchio non lo segnalava (dev 4)

ora il codice è cosi'
Codice:
#include <stdio.h>
int PIU_SIGNIFICATIVI(int A,int k);
int MENO_SIGNIFICATIVI(int A,int k);
void div_successive(int Numero_X, int base, int R_inv[], int *n);
main()
{

     int A,k,X,n,Array[32];
     short i,scelta;

     puts("Digita un valore A");
     scanf("%d",&A);

     puts("Digita quanti bit vuoi estrarre (max 32)");
     scanf("%d",&k);

     puts("Digita se estrarre i bit piu' significativi o meno significativi");
     puts("Meno significativi [0]");
     puts("Piu' significativi [1]");

     scanf("%hd",&scelta);

     while (!(scelta==0 || scelta==1))
     {
     puts ("Scelta errata, riprovare");
     scanf("%hd",&scelta);
     }

     if (scelta==0)
     X=MENO_SIGNIFICATIVI(A,k);

     else if (scelta==1)

     X=PIU_SIGNIFICATIVI(A,k);


     printf("Risultato decimale X=%d\n",X);

     div_successive (X,2,Array,&n);
     printf("Risultato binario X=");
     for (i=0;i<n;i++)
     printf("%d",Array[i]);
     printf("\n");
     system("pause");
}

int PIU_SIGNIFICATIVI(int A,int k)
{
   int mask=1;
   short i,j;

   //Creazione maschera
   for (i=0;i<k;i++)
   mask=mask<<1;
   mask--;

   printf("Maschera_1: %d\n\n",mask);
   mask=mask<<(sizeof(int)*8-k);

   printf("Maschera_2: %d\n",mask);

   return mask&A;
}

int MENO_SIGNIFICATIVI(int A,int k)
{
     short b;
     int mask=0;

     for(b=1;b<=k;b++)
     mask=mask<<1|1;
     return mask&A;
}



void div_successive(int Q, int B, int R_inv[], int *n)
{
	int Q1,j,i;
	int R[30];
	j=-1;

/* Calcolo resti */
	while (Q>0)
	{
		j+=1;
		Q1=Q/B;
		R[j]=Q-Q1*B;
		Q=Q1;
	}

/* Inversione */
	for (i=0;i<=j;i++)
	{
		R_inv[i]=R[j-i];
		R_inv[j]=R[j-i];
	}
	*n=j+1;
}
La parte meno significativa funziona, quella piu' no, il passaggio mask=mask<<(sizeof(int)*8-k); deve avere qualche errore, pechè non da il risultato corretto.

@cionci
la maschera l'ho creata in 2 modi, questo mask=mask<<1|1; è quello che intendevi tu vero?

@sottovento
Perchè devo salvare la variabile mask a 0x80000000 e poi shiftare a destra? Non è piu' comodo il mio metodo?

P.s. ma per mostrare i bit, non c'è un metodo piu' semplice di quella function per le divisioni successive enorme?
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 15:38   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
@cionci
la maschera l'ho creata in 2 modi, questo mask=mask<<1|1; è quello che intendevi tu vero?
No, te praticamente in quel modo metti un 1 al bit zero e shifti a sinistra il contenuto precedente (e quindi gli uno) già immessi... Va bene anche come l'hai fatto te, ma io intendevo questo:

for(b = 0; b < k; b++)
mask |= 1 << b;

Stai attento ai cicli for, in questo caso non cambia niente, ma non prendere l'abitudine di farli partire da 1 e farli arrivare a k...prendi invece l'abitudine di farli come ti ho scritto sopra...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 17:02   #9
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Codice:
int PIU_SIGNIFICATIVI(int A,int k)
{
     return (unsigned)(((int)0x80000000 >> k) & A) >> (32 - k);
}
Semplice, no?
__________________
In God we trust; all others bring data

Ultima modifica di sottovento : 24-04-2007 alle 17:12. Motivo: dimenticato i cast
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 18:16   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Codice:
int PIU_SIGNIFICATIVI(int A,int k)
{
     return (unsigned)(((int)0x80000000 >> k) & A) >> (32 - k);
}
Semplice, no?
Come no ...
Più semplicemente:
Codice:
int higher_bits (int value, int bits)
{
    return (int)(((unsigned int) value) >> (32-bits));
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 18:41   #11
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da andbin Guarda i messaggi
Come no ...
Più semplicemente:
Codice:
int higher_bits (int value, int bits)
{
    return (int)(((unsigned int) value) >> (32-bits));
}
Acc, mi era scappata
A questo punto, compilatore permettendo, puoi togliere l'ultimo cast in ordine di esecuzione. Rischioso, pero'...
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 18:42   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Gli si chiedeva di usare una maschera
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 18:45   #13
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da cionci Guarda i messaggi
Gli si chiedeva di usare una maschera
Infatti c'e'.
Beh, nella soluzione ottima, quella di AndBin no, ma scommetto che il prof non c'aveva pensato...
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 20:47   #14
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
grazie, quest'esercizio va sempre meglio

@andbin
ottimo il tuo suggerimento, pero' devo usare la maschera, altrimenti non seguo il testo, cmq me lo sono segnato.

@cionci
si ho messo apposta quell'1 nel for perchè b era un contatore e un'indice di 1 array, cmq l'ho cambiato in 0, in effetti è sempre meglio partire da 0

@sottovento
lol, troppo complicato

cmq ora ho fatto cosi' e viene, l'errore credo fosse nel sizeof, infatti se metto 32 a mano, il risultato viene...

Codice:
#include <stdio.h>
int PIU_SIGNIFICATIVI(int A,int k);
int MENO_SIGNIFICATIVI(int A,int k);
void div_successive(int Numero_X, int base, int R_inv[], int *n);
main()
{

     int A,k,X,n,Array[32];
     short i,scelta;

     puts("Digita un valore A (max 4294967295)");
     scanf("%d",&A);

     puts("Digita quanti bit vuoi estrarre (max 32)");
     scanf("%d",&k);

     puts("Digita se estrarre i bit piu' significativi o meno significativi");
     puts("Meno significativi [0]");
     puts("Piu' significativi [1]");

     scanf("%hd",&scelta);

     while (!(scelta==0 || scelta==1))
     {
         puts ("Scelta errata, riprovare");
         scanf("%hd",&scelta);
     }

     if (scelta==0)
     X=MENO_SIGNIFICATIVI(A,k);

     else if (scelta==1)
     X=PIU_SIGNIFICATIVI(A,k);


     printf("Risultato decimale X=%u\n",X);

        div_successive (X,2,Array,&n);
        printf("Risultato binario X=");
        for (i=0;i<n;i++)
        printf("%d",Array[i]);
        printf("\n");

        system("pause");
}

int PIU_SIGNIFICATIVI(int A,int k)
{
     int mask=1;
     //Creazione maschera
     mask=mask<<k;
     mask--;

     mask=mask<<(32-k);
     printf("%u",mask);
     printf("\n");

 //  return (int)(((unsigned int) A)>>(32-k));
     return A&mask;
}

int MENO_SIGNIFICATIVI(int A,int k)
{
     short b;
     int mask=0;

     for(b=0;b<k;b++)
     mask=mask<<1|1;
     return mask&A;
}



void div_successive(int Q, int B, int R_inv[], int *n)
{
	int Q1,j,i;
	int R[30];
	j=-1;


/* Calcolo resti */
	while (Q>0)
	{
		j+=1;
		Q1=Q/B;
		R[j]=Q-Q1*B;
		Q=Q1;
	}

/* Inversione */
	for (i=0;i<=j;i++)
	{
		R_inv[i]=R[j-i];
		R_inv[j]=R[j-i];
	}
	*n=j+1;
}
L'unico problema è ora la visualizzazione in binario

Tipo se deve scrivere 01000 scrive 1000, oppure se il numero è negativo (bit + significativo alto) la function non va perchè funziona solo per numeri maggiori di 0 (per via della condizione di questo while)
Codice:
/* Calcolo resti */
	while (Q>0)
	{
		j+=1;
		Q1=Q/B;
		R[j]=Q-Q1*B;
		Q=Q1;
	}
Ma non avete una function migliore per rappresentare il binario? Fa pena questa che ho fatto io
Non potevano mettere direttamente un modo tipo %qualcosa? lol
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2007, 21:30   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
@andbin
ottimo il tuo suggerimento, pero' devo usare la maschera, altrimenti non seguo il testo, cmq me lo sono segnato.
Ok, però se hai notato bene, la soluzione di sottovento usa proprio una maschera! Lo shift a destra di un int 0x80000000 causa il mantenimento del bit di segno a 1, che pertanto si estende verso destra di k bit.

Quote:
Originariamente inviato da k_mishima Guarda i messaggi
Ma non avete una function migliore per rappresentare il binario? Fa pena questa che ho fatto io
Non potevano mettere direttamente un modo tipo %qualcosa? lol
Guarda, se ne parla giusto in <questo> thread di questi ultimi giorni.
In più vedi la mia risposta in <questo> thread.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2007, 18:27   #16
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Codice:
#include <stdio.h>
int PIU_SIGNIFICATIVI(int A,int k);
int MENO_SIGNIFICATIVI(int A,int k);
void dec2bin(unsigned int inp, char binstr[32]);
main()
{

     int A,k,X,n;
     short i,scelta;
     char Array[32];

     puts("Digita un valore A (max 4294967295)");
     scanf("%d",&A);

     puts("Digita quanti bit vuoi estrarre (max 32)");
     scanf("%d",&k);

     puts("Digita se estrarre i bit piu' significativi o meno significativi");
     puts("Meno significativi [0]");
     puts("Piu' significativi [1]");

     scanf("%hd",&scelta);

     while (!(scelta==0 || scelta==1))
     {
         puts ("Scelta errata, riprovare");
         scanf("%hd",&scelta);
     }

     if (scelta==0)
     {
      X=MENO_SIGNIFICATIVI(A,k);
      dec2bin (X,Array);
      printf("Risultato binario X=");
      for (i=k-1;i>=0;i--)
      printf("%c",Array[i]);
     }

     else if (scelta==1)
     {
      X=PIU_SIGNIFICATIVI(A,k);
      dec2bin (X,Array);
      printf("Risultato binario X=");
       for (i=31;i>=(31-k);i--)
        printf("%c",Array[i]);
     }

     printf("\n");
     system("pause");
}

int PIU_SIGNIFICATIVI(int A,int k)
{
     int mask=1;
     //Creazione maschera
     mask=mask<<k;
     mask--;

     mask=mask<<(32-k);

 //  return (int)(((unsigned int) A)>>(32-k));
     return A&mask;
}

int MENO_SIGNIFICATIVI(int A,int k)
{
     short b;
     int mask=0;

     for(b=0;b<k;b++)
     mask=mask<<1|1;
     return mask&A;
}


void dec2bin(unsigned int inp, char binstr[32])
{
    int i;
    for (i = 0; i < 32; i++, inp >>= 1)
        binstr[i] = (inp & 1) + '0';
}
Finalmente finita, dopo ore e ore di prove

@andbin
carina la tua function per il dec2bin, molto compatta, peccato che pero' che non inverta pure l'array che deve essere stampato al contrario, altrimenti sarebbe perfetta
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2007, 21:11   #17
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
@andbin
carina la tua function per il dec2bin, molto compatta, peccato che pero' che non inverta pure l'array che deve essere stampato al contrario, altrimenti sarebbe perfetta
È così perché l'autore di quel thread aveva chiesto di non usare stringhe (solo un array di char non terminato dal nullo) e che in binstr[0] ci fosse il bit meno significativo (non so per quale motivo).

Vuoi gestire una stringa visualizzabile direttamente? Ecco:
Codice:
void dec2bin(unsigned int inp, char *binstr)
{
    int i;
    for (i = 0; i < 32; i++, inp >>= 1)
        binstr[31-i] = (inp & 1) + '0';
    binstr[32] = '\0';
}
Quindi nel main dichiari un array di char di 33 caratteri (adesso c'è anche il nullo), quindi chiami la funzione, e poi stampi direttamente con printf.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2007, 15:41   #18
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
ah, ora vedendo il tuo codici vedo che in effetti è inutile invertire l'array di caratteri, basta salvarlo direttamente al contrario

Codice:
/* Scrivere 1 function C per estrarre dalla variabile intera A i k bit più o meno
significativi dove k e A sono parametri di input usando (1) una maschera opportuna;
(2) una maschera e operatori di shif (<< o >>) */

#include <stdio.h>
int PIU_SIGNIFICATIVI(int A,int k);
int MENO_SIGNIFICATIVI(int A,int k);
void dec2bin(unsigned int inp, char binstr[32]);
main()
{

     int A,k,X,n;
     short i,scelta;
     char Array[32];

     puts("Digita un valore A (max 4294967295)");
     scanf("%d",&A);

     puts("Digita quanti bit vuoi estrarre (max 32)");
     scanf("%d",&k);

     puts("Digita se estrarre i bit piu' significativi o meno significativi");
     puts("Meno significativi [0]");
     puts("Piu' significativi [1]");

     scanf("%hd",&scelta);

     while (!(scelta==0 || scelta==1))
     {
         puts ("Scelta errata, riprovare");
         scanf("%hd",&scelta);
     }

     if (scelta==0)
     {
      X=MENO_SIGNIFICATIVI(A,k);
      dec2bin (X,Array);
      printf("Risultato binario X=");
      for (i=31;i>(31-k);i--)
      printf("%c",Array[i]);
     }

     else if (scelta==1)
     {
      X=PIU_SIGNIFICATIVI(A,k);
      dec2bin (X,Array);
      printf("Risultato binario X=");
       for (i=0;i<k;i++)
        printf("%c",Array[i]);
     }

     printf("\n");
     system("pause");
}

int PIU_SIGNIFICATIVI(int A,int k)
{
     int mask=1;
     //Creazione maschera
     mask=mask<<k;
     mask--;

     mask=mask<<(32-k);

 //  return (int)(((unsigned int) A)>>(32-k));
     return A&mask;
}

int MENO_SIGNIFICATIVI(int A,int k)
{
     short b;
     int mask=0;

     for(b=0;b<k;b++)
     mask=mask<<1|1;
     return mask&A;
}


void dec2bin(unsigned int inp, char binstr[32])
{
    int i;
    for (i = 0; i < 32; i++, inp >>= 1)
        binstr[31-i] = (inp & 1) + '0';
}
Cosi' è veramente perfetto. Ma perchè avrei dovuto usare stringhe? Va cosi' bene con i char

Ultima modifica di k_mishima : 26-04-2007 alle 21:12.
k_mishima è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Il nuovo OnePlus Nord 6 è vicino al debu...
Tesla svela i risultati del Q4: conferma...
Nuova rimodulazione da Fastweb: fino a 3...
La NVIDIA RTX 5090 potrebbe presto costa...
ASUS non produrrà più smar...
CoopVoce sta per lanciare il 5G: ecco qu...
Factorial, azienda di batterie allo stat...
Le specifiche fuori di testa della Yangw...
I numeri incredibili di Xiaomi: nel 2025...
In Cina è pronto il parco fotovol...
Neuralink accelera: produzione di massa ...
Starlink abbassa l'orbita di migliaia di...
Dal MIT una nuova batteria per auto elet...
Adam Mosseri parla di IA su Instagram: l...
Suonerie personalizzate e Tone Store: il...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v