Binario a Decimal

Hola gente, hay alguna forma de pasar esta variable con 0 y 1

String bin = "1111111";

A una variable de tipo int como decimal ??
Osea me tendria que guardar algo asi

int binDec = 255;

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Hi @mathsucksgg11

Pruébelo de esta manera.
(No sé si es la mejor manera, pero funciona).

RV mineirin

String bin = "10110111";
//----------------------------------------
void setup() {
  Serial.begin(9600);
  int k = convert(bin);
  Serial.println(k, BIN);
  Serial.println(k, HEX);
  Serial.println(k, DEC);
}
//----------------------------------------
void loop() {

  // put your main code here, to run repeatedly:
}
//----------------------------------------
byte convert(String newStr)
{
  int x = newStr.length();
  byte y = 0;
  for (int i = 0; i < x; i++)
  {
    String myString = "";
    myString = newStr.substring(i, i + 1);
    int z = myString.toInt();
    if (z == 1)
      bitSet(y, i);
    else
      bitClear(y, i);
  }
  return y;
}

Yo lo haría así

String strBin = "11100101";

int convertir(String binStr){
  int val = 0;  
  for(int i = 0; i < binStr.length(); i++){  
    val = val * 2 + (binStr[i] - 48);
  }
  return val;
}

void setup() {
  Serial.begin(115200);
  Serial.println("String = " + strBin);
  int valor = convertir(strBin);
  Serial.println(valor, BIN);
  Serial.println(valor, HEX);
  Serial.println(valor, DEC);
}

void loop() {
}

@ruilviana Tu código invierte el orden de los bits.

Saludos

Si hacia una simetria del número , pero para seguir su lógica donde pone:

bitSet(y, i);

Si pone :

bitSet(y, x-i-1);   

Lo arregla
Saludos.

Si, claro, yo solo le avisé. :wink:

Mi propuesta trabaja con hasta 32 bits (long) y tiene en cuenta sólo los caracteres 0 y 1, parando la conversión si encuentra un carácter distinto a esos dos:

String strBin = "11100101 con parte no binaria";

long convertir(const String &binStr) {
  long val = 0;
  for (size_t i = 0; i < binStr.length(); i++) {
    if (binStr[i] == '1') {
      val <<= 1;
      val |= 1;
    }
    else if (binStr[i] == '0') {
      val <<= 1;
    }
    else {
      break;
    }
  }
  return val;
}

void setup() {
  Serial.begin(115200);
  Serial.println("String = " + strBin);
  int valor = convertir(strBin);
  Serial.println(valor, BIN);
  Serial.println(valor, HEX);
  Serial.println(valor, DEC);
}

void loop() {
}

@IgnoranteAbsoluto Sabés que yo primero lo pensé como vos pero no sé por qué diablos me devolvía 10000101 en lugar de 11100101?
Lo revisé varias veces a ver donde le erraba y no lo encontré. :man_facepalming:t2:

Te olvidaste de corregir

int valor = convertir(strBin);

que debería ser

long valor = convertir(strBin);

También me gusta la solución de @ruilviana , con la salvedad de la corrección de la inversión del peso de los bits.

Por cierto, mi solución también se puede convertir a long con solo cambiar los tipos pero como el PO planteó convertir a int... :wink:

Y ya que estamos, una variante de mi codigo

String strBin = "11100101";

int convertir(String binStr){
  int val = 0;  
  for(int i = 0; i < binStr.length(); i++){  
    val = (val << 1) | (binStr[i] & 0x01);
  }
  return val;
}

void setup() {
  Serial.begin(115200);
  Serial.println("String = " + strBin);
  int valor = convertir(strBin);
  Serial.println(valor, BIN);
  Serial.println(valor, HEX);
  Serial.println(valor, DEC);
}

void loop() {
}

Curiosamente

val = (val << 1) | (binStr[i] & 0x01);

genera un código 8 bytes más pesado que

val = val * 2 + (binStr[i] - 48);

Saludos

No se me olvidó. Lo dejé adrede. Puedes declarar la variable valor del tipo que necesites : byte, char, int o long. El que la función retorne un long no te obliga a que uses un long, tan solo es para que llegado el caso puedas usar un long sin necesidad de modificar la función o definir una nueva.

Este código:

... es un poco "inseguro" porque, si por cualquier motivo el valor de binStr[i] es distinto al carácter 0 o 1, se pueden ver alterados otros bits y no sólo el que se supone que se está calculando. Así que es preferible tu segunda propuesta aunque genere un código 8 bytes mayor:

No estoy de acuerdo pero no quiero desvirtuar el tema, solo digo que no es una buena práctica, puede generar problemas.

Si eso ocurre el número ingresado ya es erróneo, por lo que considero que hacer una verificación es redundante, la verificación debió hacerse en el momento del ingreso.

Igual me gusta más con el desplazamiento, el OR y el AND, queda más "Pro". :grin:

Saludos

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.