Dev - C++ - Suma de bits

 
Vista:

Suma de bits

Publicado por Shumaro (7 intervenciones) el 08/05/2020 02:39:21
Necesito dar la suma de 2 cifras para lo que debo usar operaciones de bits, pero no se como hacer la parte correspondiente al acarreo de numeros, lo formule creando "agregado" y que este cambie a 1 y 0, pero aun no funciona, ayuda con eso
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include<stdio.h>
int main(int argc, char** argv)
{
    void despliegaBits(unsigned int, unsigned int);      //declara la funcion en el metodo main
    void Suma(unsigned int, unsigned int);
 
    unsigned int numero, numero2;   //declaracion de las varaibles que almacenan los decimales
    printf("Ingresa los numeros en decimal: ");
    scanf("%i %i",&numero,&numero2);
 
    despliegaBits(numero,numero2);     //usamos la funcion
    printf("\n");
    printf("\t-----------------------------------");
    printf(" \n");
    Suma(numero, numero2);
    printf(" \n");
}
void despliegaBits(unsigned int valor, unsigned int valor2)        //hacemos paso por referencia
{
    unsigned indice;    //variable indice del ciclo for
    unsigned int despliegaMascara = 1 << 31;
    /* define despliegaMascara y desplaza 31 bits hacia la izquierda */
    printf( "\n%5u = ", valor);
 
    for( indice =1;indice <=32;indice++)
    {
        putchar( valor & despliegaMascara ? '1':'0');
        //usando el operador & compara valor y despliegaMascara para dejar imprimir a valor
        valor<<=1;
 
        if( indice % 8 ==0){     //deja un espacio cada octeto
            putchar(' ');
        }
    }
    printf( "\n%5u = ", valor2);
    unsigned int despliegaMascara2 = 1 << 31;
    for( indice =1;indice <=32;indice++)
    {
        putchar( valor2 & despliegaMascara2 ? '1':'0');
        //usando el operador & compara valor y despliegaMascara para dejar imprimir a valor
        valor2<<=1;
 
        if( indice % 8 ==0){     //deja un espacio cada octeto
            putchar(' ');
        }
    }
}
 
 
 
 
void Suma(unsigned int sumando1, unsigned int sumando2)
{
    unsigned int despliegaMascara2 = 1 << 31;
    unsigned int agregado = 1 << 29;
 
    unsigned int indice;
    char binario[31];
 
    for( indice =1;indice <=32;indice++)
    {
        if(  agregado & despliegaMascara2){
 
            if(sumando1 & despliegaMascara2 & sumando2 & despliegaMascara2){
                binario[indice]='3';
 
            }else if(sumando1 & despliegaMascara2 ^ sumando1 & despliegaMascara2){
                binario[indice]='0';
            }else{
                binario[indice]='1';
                //
                agregado>>=1;
            }
 
        }else if(sumando1 & despliegaMascara2 & sumando2 & despliegaMascara2){
               binario[indice]='0';
               agregado<<=1;
            }else if(sumando1 & despliegaMascara2 ^ sumando2 & despliegaMascara2){
                binario[indice]='1';
            }else{
                binario[indice]='0';
            }
 
 
        sumando1<<=1;
        sumando2<<=1;
 
 
    }
    printf("\t");
    for( indice =1;indice <=32;indice++)
    {
        printf("%c",binario[indice]);
        if( indice % 8 ==0){
            putchar(' ');
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Suma de bits

Publicado por Nacho (181 intervenciones) el 08/05/2020 11:26:37
Me parece que tienes bastante lío en la función Suma.

El acarreo hay que entenderlo como un bit más en un registro, quedando como el de más peso. Si sumas dos registros de 8 bits, cuentas que tienes 9.

Así, 127 + 1 sin acarreo con 8 bits sería:
11111111 +
00000001
--------------
00000000

con acarreo 127 + 1:
011111111 +
000000001
---------------
100000000
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Suma de bits

Publicado por Shumaro (7 intervenciones) el 08/05/2020 18:40:55
y como puedo agregar ese bit? que aun habran diferentes casos dependiendo de los numeros binarios y el esquema me parece seria similar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Suma de bits

Publicado por Rodrigo (539 intervenciones) el 08/05/2020 22:04:51
Usa Xor para la suma, shift left y and para la reserva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Suma de bits

Publicado por Nacho (181 intervenciones) el 09/05/2020 14:06:36
Aunque me da que el problema lo tienes más en el me llevo una que en el acarreo.

Esto hace lo que quieres.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void Suma2(unsigned int sumando1, unsigned int sumando2)
{
    char binario[33];
    bool mellevouna = false;
    int i = 0;
    unsigned int mascara = 1;
    do
    {
        bool bitsum1 = (sumando1 & mascara) != 0;
        bool bitsum2 = (sumando2 & mascara) != 0;
        if (mellevouna)
        {
            if (!bitsum1)
            {
                bitsum1 = true;
                mellevouna = false;
            }
            else if (!bitsum2)
            {
                bitsum2 = true;
                mellevouna = false;
            }
        }
        binario[i] = ((bitsum1 ^ bitsum2) | mellevouna) + 0x30;
        mellevouna = bitsum1 & bitsum2;
        i++;
        mascara <<= 1;
    } while (i < 32);
}

Falta el acarreo, pero el array es de 33 chars y es lo más fácil. Mira a ver si lo optimizas que tiene pinta guarra.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Suma de bits

Publicado por Rodrigo (539 intervenciones) el 09/05/2020 15:06:44
Mira como actua la suma de bits, y la reserva que se produce

1
2
3
4
.   0 + 0 = 0    reserva = 0
    0 + 1 = 1    reserva = 0
    1 + 0 = 1    reserva = 0
    1 + 1 = 0    reserva = 1

el resultado de la suma es exactamente xor.
el resultado de la reserva es exactamente el resultado de and

La suma estaria lista si no fuera por que hay reserva.
-> calcular la suma, y sumarle el carry si es que hay.

- Se pueden calcular las sumas simultaneamente de todos los bits presentes en los 2 numeros.
- No es necesario hacerlo bit por bit. No es necesario guardar los datos parciales en un arreglo.
- El carry hay que sumarlo a la columna de bits de la izquierda, por eso se le hace shift left 1 antes de sumarlo.

Una implementacion posible la puedes ver aqui.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Suma de bits

Publicado por Federico (1 intervención) el 14/04/2021 00:02:08
Hola.
Fijate que el bit de suma es bitS=(bitA XOR bitB) XOR Cyin
y el carry siguiente es Cyout=(bitA AND bitB) OR [(bitA XOR bitB) AND Cyin
Y la funcion sumar bit a bit seria de la forma:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int sumar (int s1, int s2)
{
  char cy = 0;
  char sm1 = 0;
  int sm = 0;
  for (char j = 0; j < sizeof(int)*8; j++)
    {
      sm1 = (((s1 >> j) & 1) ^ ((s2 >> j) & 1)) ^ cy;
      sm = sm | sm1 << j;
      cy = (((s1 >> j) & 1) & ((s2 >> j) & 1)) | (((s1 >> j) & 1) ^ ((s2 >> j) & 1)) & cy;
    }
  return sm;
}
int main ()
{
 
    printf("%d + %d = %d",1234,5678,sumar(1234,5678));
}

https://onlinegdb.com/B1PiV57Ud

Espero te sirva.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar