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;
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.
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é.
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é.
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...
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".
Saludos
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.