4

Partiendo de dos variables string que conteienen un valor binario.

var a = "11000000101010000000000100000001";
var b = "11111111111111110000000000000000";

Comó obtener una nueva variable como resultado de hacer un AND a las dos menciondas.

Es decir, obtener una nueva variable como la siguiente:

var c = "11000000101010000000000000000000";

Deivid_41
  • 706
  • 4
  • 16
  • ¿Cuál es el resultado que deseas obtener? – BetaM Sep 27 '19 at 16:38
  • El resultado que deseo obtener es lo que se obtiene cuando se realiza un AND entre 1 y 0, por cada digito del string. Es decir, en el ejemplo deberia obtener "11000000101010000000000000000000" – Deivid_41 Sep 27 '19 at 16:45
  • Creo entender lo que tratas de buscar es una comparacion de la casilla a && b y su resultado es lo que espera que seria si 1 && 1 = 1 o 1 && 0 = 0. dame un chance para ayudarte con el codigo. – Alexander Rodriguez Sep 27 '19 at 16:56
  • Lo que intento obtener es una nueva variable "var c" que contenga "11000000101010000000000000000000" – Deivid_41 Sep 27 '19 at 17:03
  • No pongo código, ya que el resto del código no tiene nada que ver con este calculo. Lo único necesario para este cálculo es la información proporcionada. Ya que es solo una simple operación entre dos variables. – Deivid_41 Sep 27 '19 at 17:10

4 Answers4

6

Una forma sencila y elegante que tal si usamos la comparador binario &

let a = "11000000101010000000000100000001";
let b = "11111111111111110000000000000000";


let c = "";

for (let i = 0; i < a.length; i++) {
  c += a[i] & b[i] 
}

console.log(c);

Puedes comparar por numero, en vez de bit, dejo el ejemplo a continuacion:

let a = 30
let b = 35
console.log(a.toString(2))
console.log(b.toString(2))
console.log((a & b).toString(2))

Un ejemplo sin ciclos repetitivos

let a = "11000000101010000000000100000001";
let b = "11111111111111110000000000000000";

let x = parseInt(a, 2) & parseInt(b, 2)
x = (x >>> 0)
console.log(x.toString(2))

Aqui tienes otro ejemplo de lo que puedes hacer: Llevamos el string a entero de bit hacemos la comparacion por bit Regresamos el numero a bit antes de eso eliminamos el signo puedes ver mas en esta respuesta

¿Cómo detectar paridad de un numero sin el operador %?

JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
3

Si entendí bien, puedes recorrer posición por posición y si se cumple que alguno es cero ponemos un 0, sino un 1.

var a = "11000000101010000000000100000001";
var b = "11111111111111110000000000000000";


var c = "";

for (let i = 0; i < a.length; i++) {
  c += (!+a[i] || !+b[i]) ? "0" : "1";
}

console.log(c);

Agregamos un + delante de cada dígito para transformar un string en el número 0 o 1, de manera de aprovechar el hecho de que 0 es false y con !0 es true. Asignamos un nuevo valor al final con c += "algo"

Emeeus
  • 7,104
  • 8
  • 25
  • Yo te he votado positivo, sin embargo considero que una explicación mas amplia sobre el proceder del bucle ayudaría mucho a la comunidad en general – BetaM Sep 27 '19 at 17:21
  • Gracias @Aprendiz, agregue mas explicación – Emeeus Sep 27 '19 at 17:53
0

NUEVA SOLUCION

Simplificando el codigo se puede realizar operacion en una comparacion AND con estas pocas lineas:

Link de referencia:

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/Bitwise_Operators

Adjunto el nuevo codigo.

  <script>
      
        var a = "11000000101010000000000100000001";
        var b = "11111111111111110000000000000000";
   
    a= parseInt(a,2); // pasar en entero base 2
    b= parseInt(b,2); // pasar en entero base 2
    r = a & b;        // operador binario &
    r = r.toString(2);  // pasar resultado a string base 2
    document.writeln('R= ' + r +'<br>');
    </script>

Esta es mi solucion a la pregunta:

Aqui te adjunto una funcion para evaluar las dos variable a y b y obtener el resultado.

La funcion lo que hace es convertir es string en un arreglo para A y B, luego se hace un for() para recorrer cada item del arreglo comparando que ambos A y B sean 1 entonces se concatena a la variable resultado el valor 1 y de lo contrario 0. (para su funcionamiento ambas variables deben tener la misma cantidad de caracteres porque no hay validacion para completar con ceros a la izquierda.

     var a = "11000000101010000000000100000001";
        var b = "11111111111111110000000000000000";

      function comparadorbinario(a,b) {
          // pasar en array;
          var arregloA = a.split('');
          var arregloB = b.split('');
          var resultado= '';
          var salida = null;
          // 
          for (let index = 0; index < arregloA.length; index++) {
              // comparacion
              if (arregloA[index]=='1' && arregloB[index]=='1') {  
                resultado = resultado.concat('1');
              }  else { 

               resultado = resultado.concat('0');
              }       
          } // fin for
          return resultado;
      }
      

      // salida de ejecucion en la funcion
      var r = comparadorbinario(a,b);
      document.writeln('A= ' + a +'<br>');
      document.writeln('B= ' + b +'<br>');
      document.writeln('R= ' + r +'<br>');
Alexander Rodriguez
  • 2,653
  • 5
  • 16
0

Podes convertir el texto binario en un decimal, hacer la operación y luego volver a convertirlo en testo binario

var a = "11000000101010000000000100000001";
var b = "11111111111111110000000000000000";

var aDecimal = bin2dec(a);
var bDecimal = bin2dec(b);

var operacion = aDecimal & bDecimal;

console.log("Resultado Operacion: " + dec2bin(operacion));

function bin2dec(bin){
  return parseInt(bin, 2);
}
function dec2bin(dec){
  return (dec >>> 0).toString(2);
}

Espero que te sirva Saludos!