Newsgroup: it.comp.lang.c
Titolo: DECIMALI---->BINARI

Ciao a tutti. In qualche post precedente ho chiesto delle info riguardo gli
operatori bit a bit. Capito l'utilizzo di shift, mi sono chiesto come fare
per creare un programma che ricevuto da tastiera un numero intero decimale,
permetta la visualizzazione dello stesso numero in forma binaria, vista la
mancanza di un marcatore binario.
Vi sarei grato se mi aiutaste almeno a costruire lo pseudo-codice o
l'organigramma corrispondente. Scusate se ho proposto un tema già da me
trattato, anche se in parte.
Ciao

 numero in forma binaria, vista la mancanza di un marcatore binario.
void print_bin(int n) {
  char buffer[128]; /* spazio per 128 0 o 1, ma e' meglio malloc */
  int counter;
  int tmp;
  counter = 0;
  printf("%d in binario = ", n);
  do {
    tmp = n & 1;
    n = n >> 1;
    tmp ? buffer[counter] = '1' : buffer[counter] = '0'
    counter = counter +1;
  } while (n);
  buffer[counter] = '\0';
  printf("%s\n", buffer);
}
occhio che c'e' un comportamento strano ;)
a te trovarlo e correggerlo (ci sono 2 modi)


Talking about music is like dancing about architecture.
                -- Laurie Anderson

 mancanza di un marcatore binario.
Preso il numero decimale, devi procedere  con una serie di divisioni per
2 (shift destra di una  posizione). Ogni volta controlli il resto. Se e`
1 memorizzi 1, altrimenti memorizzi 0. Alla fine avrai il numero scritto
in binario al contrario.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
char *bin(int num) {
	char *ret = malloc(sizeof(int) * CHAR_BIT + 1);
	int r;
	int c;
	memset(ret, '0', sizeof(int) * CHAR_BIT + 1);
	ret[sizeof(int) * CHAR_BIT] = 0;
	for (c = sizeof(int) * CHAR_BIT - 1; num; c--) {
		r = num % 2;
		num >>= 1;
		if (r != 0)
			ret[c] = '1';
		else
			ret[c] = '0';
	}
	return ret;
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La somma dell'intelligenza sulla terra e` una costante.
La popolazione e` in aumento.

mancanza di un marcatore binario.
<CODE>
#include <stdio.h>
void print_binary(int n)
{
     if ( n )
     {
        print_binary(n >> 1);
        printf("%d", (n & 1));
     }
}
int main(int argc, char* argv[])
{
    print_binary(214);
    getchar();
    return 0;
}
</CODE>
Per esercizio, puoi riscriverlo in forma iterativa ;)
-- 
The Follet

 wrote in message
3bf2907...@news.tin.it...


quello che hai scritto è un programma che usa una funziona ricorsiva vero?
Esatto.
In realta', si tratta di invertire l'output, rispetto a come
sono calcolati i resti delle divisioni per 2.
Ogni funzione, cioe', esegue prima il calcolo dei resti del
suo argomento diviso 2 e poi stampa il resto della divisione
del proprio argomento per 2.
-- 
The Follet

mancanza di un marcatore binario.
ho trovato:
#include<stdio.h>
void main()
{int a=0, b, m, cont, nbits;
 unsigned mask;
 nbits=8*sizeof(int);
 m=0x1 << (nbits - 1);
 do {printf("\n \n Digita un elemento di Z (0 per finire): ", a);
       a=0;// a anche negativo
       scanf("%d", &a);
       mask=m;
       for(cont=1;cont<=nbits; cont++)
                  {b=(a & mask) ? 1: 0;
                   printf("%x",b);
                   if(cont%4==0) printf(" ");
                   mask >>= 1;
                   }
      }while(a !=0);
}
il fatto che mi risulta 0 uguale a:
0000 0000 0000 0000 0000 0000 0000 0000
significa che int da me ha la dimensione di 32bit?

 wrote in message
3bf2420b...@news.tin.it...


b=(a & mask) ? 1: 0;
se a, mask sono interi e mask=2=00000010 in binario allora
b=0 <=> (a & mask)=0  <=> a ha il bit di posto due uguale a zero; 
b=1 <=> (a & mask)!=0 <=> a ha il bit di posto due uguale a uno;
=> b='il valore del bit di posto due di a'
giusto?
0x1=1 ?
perché non scrivere 1 a posto di 0x1?