Aquí está mi código que toma una cadena de 4 caracteres de 1 y 0 y se convierte a decimal usando la función bitset. Está devolviendo valores correctos para todas las combinaciones, excepto las que involucran 11 y 10 como {1110,1010,1011,1111}. Para estos números, devuelve el resultado ignorando MSB. Eso es para 1010 dando 2 como respuesta.

#include<bits/stdc++.h>
using namespace std;
#define ul unsigned long

int main(int argc, char const *argv[])
{
    int bin1=0,bin2=0,choice=0;
    ul x1=0,x2=0;
    //string binary;
    cin>>bin1;
    x1=bitset<4>(bin1).to_ulong();
    cin>>bin2;  
    x2=bitset<4>(bin2).to_ulong();
    cout<<x1<<" "<<x2<<endl;
    return 0;

}

EDITAR aquí es la instantánea de mis resultados

enter image description here

Otra instantánea del mismo programa leyendo otro conjunto de entrada, pero esta vez da la salida correcta. Por cierto, 1101 y 1001 son las entradas y las siguientes dos limas son la salida

enter image description here

-2
Midhun 27 feb. 2018 a las 12:41

5 respuestas

La mejor respuesta

Necesita la string sobrecarga del constructor del conjunto de bits.

template<class CharT, class Traits, class Alloc>

explicit bitset( const std::basic_string<CharT,Traits,Alloc>& str,
                 typename std::basic_string<CharT,Traits,Alloc>::size_type pos = 0,
                 typename std::basic_string<CharT,Traits,Alloc>::size_type n =
                     std::basic_string<CharT,Traits,Alloc>::npos,
                 CharT zero = CharT('0'),
                 CharT one = CharT('1'));

Desde su caso de uso, parece que cambiar el tipo de bin1 y bin2 a std::string puede funcionar.

0
bashrc 27 feb. 2018 a las 10:06

Cuando ingresas p. 1010 entonces ese es el valor decimal 1010, que en binario es 1111110010.

Este es el valor con el que inicializa el conjunto de bits. Como el conjunto de bits solo contiene cuatro bits, se utilizarán los cuatro bits más bajos, que son 0010.

La solución simple es leer la entrada como cadenas .

2
Some programmer dude 27 feb. 2018 a las 09:49

No sé qué esperas, pero el código se expresa lo suficientemente claro. Extraje solo el mínimo requerido para la discusión:

int bin1=0;
cin>>bin1;

bin1 es int. Lees un int de cin y ese int es 1010. Que es mil diez . No hay partes involucradas aquí.

En binario, 1010 (mil diez) se ve así: 00000011 11110010

x1=bitset<4>(bin1).to_ulong();

Cuando bitset<4> se construye utilizando el valor de bin1 solo se utilizan los 4 bits más a la derecha (menos significativos) de bin1. Estos bits son 0010 y representan el número 2. El valor de x1 es 2.

De manera similar, el valor de bin2 leído de cin es 1110 ( mil ciento diez ), su representación binaria es {{X3 }}, sus bits 4 más a la derecha son 0110 y son la representación binaria del número entero 6.

El código hace lo que se supone que debe hacer; Sus expectativas son incorrectas.

Lea sobre bitset::bitset(). Contiene ejemplos que deberían ayudarlo a comprender la diferencia.

0
axiac 27 feb. 2018 a las 10:02

Bitset cambia su entrada en una representación binaria, por lo que la representación binaria de 0 y 1 de:

1010 -> 1111110010

1100 -> 10001001100

Está tomando solo 4 bits de 32 (int generalmente tiene 4 bytes, 4 * 8 = 32 bits), por lo que

1010 -> 0010 -> decimal 2

1100 -> 1100 -> decimal 12

1
Kaldrr 27 feb. 2018 a las 09:50
cout << bitset<4>(1010).to_ulong() << endl;

Impresiones 2.


cout << bitset<4>(0b1010).to_ulong() << endl;

Imprime 10. (Nota: literales binarios se introdujeron en C ++ 14)


De la cppreference documentación de std::bitset:

bitset( unsigned long val );

Construye un conjunto de bits, inicializando las primeras posiciones de bit M (más a la derecha, menos significativas) a los valores de bit correspondientes de val, donde M es el menor del número de bits en un largo largo sin signo y el número de bits N en el conjunto de bits que se está construyendo . [...]

La representación de bits de 1010 no es 0b1010, es 0b1111110010, que es demasiado grande para el conjunto de bits. Es por eso que estás viendo resultados inesperados.

6
Vittorio Romeo 27 feb. 2018 a las 10:30