elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?  (Leído 2,197 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.265


Hackentifiko!


Ver Perfil
El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
« en: 20 Mayo 2024, 12:22 pm »

explícame cómo funciona el desplazamiento | en programación

GPT:
Citar
En programación, el operador de desplazamiento `|` se conoce como "OR a nivel de bits" o "OR bit a bit". Este operador se utiliza principalmente en lenguajes de programación que admiten manipulación de bits, como C, C++, Java, entre otros.

El operador `|` realiza una operación lógica OR (o inclusiva) entre los bits de dos operandos. A nivel de bits, el OR devuelve un 1 si al menos uno de los bits correspondientes en los operandos es 1. Si ambos bits son 0, el resultado será 0.

Aquí hay un ejemplo para ilustrar cómo funciona el operador de desplazamiento `|`:

Supongamos que tenemos dos números en representación binaria:

```
A: 11001010
B: 10110111
```

Si aplicamos el operador `|` entre A y B, el resultado sería:

```
A | B: 11111111
```

Cada bit en la posición correspondiente se compara entre A y B. Si al menos uno de los bits es 1, el resultado tendrá un 1 en esa posición. En este caso, todos los bits son 1 porque hay al menos un 1 en cada posición.

Es importante destacar que el operador `|` se aplica a nivel de bits, lo que significa que opera individualmente en cada bit de los operandos. Esto puede ser útil cuando se trabaja con máscaras de bits, banderas o manipulación de bits específica.

Espero que esta explicación te haya ayudado a comprender cómo funciona el operador de desplazamiento `|` en programación. Si tienes alguna otra pregunta, ¡no dudes en preguntar!

y el and?

Citar
¡Claro! El operador de desplazamiento `&` se conoce como "AND a nivel de bits" o "AND bit a bit" en programación. Este operador se utiliza para realizar una operación lógica AND entre los bits correspondientes de dos operandos.

El operador `&` compara los bits en cada posición de los operandos y devuelve un 1 si y solo si ambos bits correspondientes son 1. Si alguno de los bits es 0, el resultado será 0.

Aquí hay un ejemplo para ilustrar cómo funciona el operador de desplazamiento `&`:

Supongamos que tenemos dos números en representación binaria:

```
A: 11001010
B: 10110111
```

Si aplicamos el operador `&` entre A y B, el resultado sería:

```
A & B: 10000010
```

Cada bit en la posición correspondiente se compara entre A y B. Solo si ambos bits son 1, el resultado tendrá un 1 en esa posición. En este caso, solo el séptimo y el segundo bit son 1 en ambos operandos, por lo que el resultado tiene un 1 solo en esas posiciones.

Al igual que con el operador `|`, el operador `&` se aplica a nivel de bits y es útil para realizar operaciones de máscaras de bits, filtrado de bits o verificación de ciertas propiedades de los bits.

Espero que esta explicación te haya ayudado a comprender cómo funciona el operador de desplazamiento `&` en programación. Si tienes más preguntas, ¡no dudes en hacerlas!

para qué sirven esos desplazamientos, por qué se le llama desplazamientos?

Citar
Los operadores de desplazamiento, como `<<` (desplazamiento a la izquierda) y `>>` (desplazamiento a la derecha), son diferentes de los operadores `|` y `&` que mencionamos anteriormente. Permíteme explicarte cómo funcionan y por qué se les llama "desplazamientos".

Estos operadores de desplazamiento se utilizan para mover los bits de un número hacia la izquierda o hacia la derecha. El desplazamiento se realiza en función de la cantidad de posiciones especificadas.

1. Desplazamiento a la izquierda (`<<`): Este operador desplaza los bits de un número hacia la izquierda en la cantidad de posiciones especificadas. Cada desplazamiento hacia la izquierda duplica el valor del número. Por ejemplo:

   ```
   5 << 2 // Resultado: 20
   ```
  
   En este caso, el número 5 en binario es `101`. Al desplazarlo dos posiciones hacia la izquierda, obtenemos `10100`, que es el número 20 en binario.

2. Desplazamiento a la derecha (`>>`): Este operador desplaza los bits de un número hacia la derecha en la cantidad de posiciones especificadas. Cada desplazamiento hacia la derecha divide el valor del número. Hay dos tipos de desplazamiento a la derecha: desplazamiento a la derecha lógico y desplazamiento a la derecha aritmético.

   - Desplazamiento a la derecha lógico (`>>>`): En este tipo de desplazamiento, los bits se desplazan hacia la derecha y se rellenan con ceros en la posición más significativa. Por ejemplo:

     ```
     20 >>> 2 // Resultado: 5
     ```
    
     En este caso, el número 20 en binario es `10100`. Al desplazarlo dos posiciones hacia la derecha, obtenemos `101`, que es el número 5 en binario.

   - Desplazamiento a la derecha aritmético (`>>`): En este tipo de desplazamiento, los bits se desplazan hacia la derecha y se rellenan con el bit más significativo (el bit de signo) en la posición más significativa. Esto significa que si el número es positivo, se rellena con ceros, y si el número es negativo, se rellena con unos. Por ejemplo:

     ```
     -20 >> 2 // Resultado: -5
     ```
    
     En este caso, el número -20 en binario es `11111111111111111111101100`. Al desplazarlo dos posiciones hacia la derecha, obtenemos `11111111111111111111111011`, que es el número -5 en binario.

Los operadores de desplazamiento son útiles en situaciones donde se necesita manipular bits individuales de un número, realizar cálculos rápidos de potencias de dos, implementar algoritmos de codificación o decodificación, y en otros casos específicos relacionados con la manipulación de bits.

Espero que esta explicación aclare el concepto de desplazamientos y cómo se utilizan en programación. Si tienes más preguntas, no dudes en hacerlas.

dame un ejemplo de un operador or usado en un programa

Citar
Aquí tienes un ejemplo sencillo de cómo se puede utilizar el operador OR (`|`) en un programa:

Supongamos que tienes un programa en C que maneja permisos de usuario representados como combinaciones de banderas o "flags". Cada flag indica un permiso específico, y puedes combinar múltiples flags utilizando el operador OR para obtener un conjunto de permisos completo.

```c
#include <stdio.h>

// Definición de flags de permisos
#define PERM_READ  1  // Permiso de lectura: 0001 en binario
#define PERM_WRITE 2  // Permiso de escritura: 0010 en binario
#define PERM_EXEC  4  // Permiso de ejecución: 0100 en binario

int main() {
    int permisosUsuario = PERM_READ | PERM_WRITE;  // Combinación de permisos de lectura y escritura

    // Verificación de permisos
    if (permisosUsuario & PERM_READ) {
        printf("El usuario tiene permiso de lectura.\n");
    }
    if (permisosUsuario & PERM_WRITE) {
        printf("El usuario tiene permiso de escritura.\n");
    }
    if (permisosUsuario & PERM_EXEC) {
        printf("El usuario tiene permiso de ejecución.\n");
    } else {
        printf("El usuario no tiene permiso de ejecución.\n");
    }

    return 0;
}
```

En este ejemplo, definimos tres flags de permisos (`PERM_READ`, `PERM_WRITE` y `PERM_EXEC`) que se representan mediante valores binarios distintos. Luego, utilizamos el operador OR (`|`) para combinar los flags de permisos de lectura y escritura en la variable `permisosUsuario`.

Después, utilizamos el operador AND (`&`) en una serie de condiciones para verificar los permisos del usuario. Si el resultado de la operación AND entre los permisos del usuario y un flag específico es distinto de cero, significa que el usuario tiene ese permiso y se muestra un mensaje correspondiente.

En este caso, el programa imprimirá los mensajes "El usuario tiene permiso de lectura." y "El usuario tiene permiso de escritura.", ya que esos flags están presentes en la combinación de permisos del usuario. Sin embargo, no imprimirá el mensaje "El usuario tiene permiso de ejecución." porque ese flag no está presente en los permisos del usuario.

Este es solo un ejemplo básico para ilustrar el uso del operador OR en un programa. En aplicaciones reales, la combinación de flags y el uso de operadores OR pueden ser mucho más complejos y variados, dependiendo de los requisitos específicos del programa.

dame otro ejemplo, pero relacionado con videojuegos

Citar
Claro, aquí tienes un ejemplo relacionado con videojuegos. Supongamos que estás desarrollando un videojuego de plataformas y tienes un personaje que puede tener diferentes habilidades. Puedes utilizar el operador OR (`|`) para combinar las habilidades del personaje y determinar qué acciones puede realizar.

```python
# Definición de habilidades del personaje
HABILIDAD_SALTO = 1     # Salto: 0001 en binario
HABILIDAD_CORRER = 2    # Correr: 0010 en binario
HABILIDAD_ATACAR = 4    # Atacar: 0100 en binario
HABILIDAD_PLANEAR = 8   # Planear: 1000 en binario

# Habilidades del personaje
habilidades_personaje = HABILIDAD_SALTO | HABILIDAD_CORRER | HABILIDAD_ATACAR

# Verificación de habilidades
if habilidades_personaje & HABILIDAD_SALTO:
    print("El personaje puede saltar.")

if habilidades_personaje & HABILIDAD_CORRER:
    print("El personaje puede correr.")

if habilidades_personaje & HABILIDAD_ATACAR:
    print("El personaje puede atacar.")

if habilidades_personaje & HABILIDAD_PLANEAR:
    print("El personaje puede planear.")
else:
    print("El personaje no puede planear.")
```

En este ejemplo, el personaje tiene cuatro habilidades diferentes: salto, correr, atacar y planear. Cada habilidad se representa mediante un valor binario diferente. Utilizamos el operador OR (`|`) para combinar las habilidades del personaje en la variable `habilidades_personaje`.

Luego, utilizamos el operador AND (`&`) en una serie de condiciones para verificar las habilidades del personaje. Si el resultado de la operación AND entre las habilidades del personaje y una habilidad específica es distinto de cero, significa que el personaje tiene esa habilidad y se muestra un mensaje correspondiente.

En este caso, el programa imprimirá los mensajes "El personaje puede saltar.", "El personaje puede correr." y "El personaje puede atacar.", ya que esas habilidades están presentes en las habilidades del personaje. Sin embargo, no imprimirá el mensaje "El personaje puede planear." porque esa habilidad no está presente en las habilidades del personaje.

Este es solo un ejemplo básico para ilustrar el uso del operador OR en un contexto de videojuegos. En un juego real, las habilidades y su combinación podrían ser mucho más complejas y permitir una amplia variedad de acciones para el personaje.

No entiendo ¿no es más fácil algo como:
HABILIDAD_SALTO = true
HABILIDAD_CORRER = true
HABILIDAD_ATACAR = true
HABILIDAD_PLANEAR = false
Si HABILIDAD_SALTO == true
  puede saltar
etc? O en vez de true/false, "Sí"/"No", 1/0, etc.

Yo quiero aprender eso del or y and si es algo que no se puede hacer de otro modo o resulta mucho más fácil hacerlo así. Si es por agilizar procesos, entiendo que es importante pero por ahora paso.

A un número le puedo sumar otro, eso es útil y difícilmente insustituible.

El or viene a decir que a 2 binarios los puedo transformar en 1, uno tiene más probabilidad de tener 1s ¿pero eso para qué sirve?

Capaz que los ejemplos que me dió son incorrectos, imagino que si se tienen 2 cosas a comparar, con muchas variables, en vez de hacer:
SumaDe1 = Objeto1TieneCuello+Objeto1TieneManos+Objeto1TienePiernas
SumaDe2 = Objeto2TieneCuello+Objeto2TieneManos+Objeto2TienePiernas
Si SumaDe1 == SumaDe2
  los objetos son iguales
...
usando or se podría hacer la comparación sin sumar ni usar 3 ifs ¿puede ser?


« Última modificación: 20 Mayo 2024, 12:31 pm por Tachikomaia » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.088



Ver Perfil
Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
« Respuesta #1 en: 20 Mayo 2024, 15:30 pm »

Citar
No entiendo ¿no es más fácil algo como:
HABILIDAD_SALTO = true
HABILIDAD_CORRER = true
HABILIDAD_ATACAR = true
HABILIDAD_PLANEAR = false
Si HABILIDAD_SALTO == true
  puede saltar
etc? O en vez de true/false, "Sí"/"No", 1/0, etc.

Fácil de entender por su legibilidad si es.

Citar
Yo quiero aprender eso del or y and si es algo que no se puede hacer de otro modo o resulta mucho más fácil hacerlo así. Si es por agilizar procesos, entiendo que es importante pero por ahora paso.

A un número le puedo sumar otro, eso es útil y difícilmente insustituible.

El or viene a decir que a 2 binarios los puedo transformar en 1, uno tiene más probabilidad de tener 1s ¿pero eso para qué sirve?

Capaz que los ejemplos que me dió son incorrectos, imagino que si se tienen 2 cosas a comparar, con muchas variables, en vez de hacer:
SumaDe1 = Objeto1TieneCuello+Objeto1TieneManos+Objeto1TienePiernas
SumaDe2 = Objeto2TieneCuello+Objeto2TieneManos+Objeto2TienePiernas
Si SumaDe1 == SumaDe2
  los objetos son iguales
...
usando or se podría hacer la comparación sin sumar ni usar 3 ifs ¿puede ser?

ChatGPT te ha respondido bien y dado buenos ejemplos, quizá solo falte algo de conceptos teóricos para aplicarlos en la práctica.

No creo que haya problemas de agilidad porque son procesos muy simples, al final será ínfimamente más ágil aquel que se acerque más al juego de instrucciones del procesador de forma más simplificada, y claro, tener todo en una sola variable simple siempre tomará menos recursos.

- Y justo ahí está su beneficio, puedes mandar o trabajar con una sola variable que a nivel bit tenga varios estados o variables simples como muestra ChatGPT en su último ejemplo.

Aunque ChatGPT ya mostró el funcionamiento en la práctica de OR, AND y los desplazamientos puede que en otros lados te muestren las famosas tablas de verdad de OR y AND para que las memorices, o si quieres el "truco" el OR es como sumar y el AND es como multiplicar:

A:    11001010 +
B:    10110111
-----------------
A|B: 11111111

1 + 1 = 2, pero como en binario no puedes escribir literalmente 2 pondrías 1 y llevarías 1 PERO como esto es una operación OR donde se opera bit a bit lo que llevas se pierde (como si solo existiera una cifra posible), como es un "truco" tiene esas restricciones. Si por el contrario quieres usar la Tabla de verdad OR implica que el resultado será 1 (verdadero) si al menos uno de los bits a comparar es 1, también es correcto decir que el resultado será 0 (falso) si ambos bit a operar son también 0. Todo esto es tal cual sucede en la programación real con OR:

if (true || true) // true
if (true || false) // true
if (false || true) // true
if (false || false) // false

En caso de AND

A:     11001010 *
B:     10110111
------------------
A&B: 10000010

- Acá es más fácil, 1 * 1 = 1, 1 * 0 = 0, 0 * 1 = 0, solo da 1 (verdadero) si ambos bit son 1, resulta 0 en cualquier otro caso. En programación:

if (true && true) // true
if (true && false) // false
if (false && true) // false
if (false && false) // false

---

Citar
Código
  1. python
  2. # Definición de habilidades del personaje
  3. HABILIDAD_SALTO = 1     # Salto: 0001 en binario
  4. HABILIDAD_CORRER = 2    # Correr: 0010 en binario
  5. HABILIDAD_ATACAR = 4    # Atacar: 0100 en binario
  6. HABILIDAD_PLANEAR = 8   # Planear: 1000 en binario
  7.  
  8. # Habilidades del personaje
  9. habilidades_personaje = HABILIDAD_SALTO | HABILIDAD_CORRER | HABILIDAD_ATACAR
  10.  
  11. # Verificación de habilidades
  12. if habilidades_personaje & HABILIDAD_SALTO:
  13.    print("El personaje puede saltar.")
  14.  
  15. if habilidades_personaje & HABILIDAD_CORRER:
  16.    print("El personaje puede correr.")
  17.  
  18. if habilidades_personaje & HABILIDAD_ATACAR:
  19.    print("El personaje puede atacar.")
  20.  
  21. if habilidades_personaje & HABILIDAD_PLANEAR:
  22.    print("El personaje puede planear.")
  23. else:
  24.    print("El personaje no puede planear.")
  25.  

Bien, esta es una aplicación práctica porque se usa una sola variable "habilidades_personaje" para englobar otras ya que a nivel bit tiene reservadas posiciones para guardar/obtener dichas variables.

Código
  1. # Habilidades del personaje
  2. habilidades_personaje = HABILIDAD_SALTO | HABILIDAD_CORRER | HABILIDAD_ATACAR

- Esto está sumando las habilidades, recordar que se está trabajando a nivel bit y que estos bits no están interfiriendo con otros

Código
  1. # Definición de habilidades del personaje
  2. HABILIDAD_SALTO = 1     # Salto:   0001 en binario
  3. HABILIDAD_CORRER = 2    # Correr:  0010 en binario
  4. HABILIDAD_ATACAR = 4    # Atacar:  0100 en binario
  5. HABILIDAD_PLANEAR = 8   # Planear: 1000 en binario

- Si los sumas o aplicas OR cada uno está en su columna sin molestar al vecino, si por ejemplo solo quiero que Salte y Ataque:

HABILIDAD_SALTO:     0001 // 1
HABILIDAD_ATACAR:   0100 // 4
habilidades_personaje: 0101 // 5

Ahora solo toca obtener el valor, para eso basta con revisar bit a bit, ya sabemos que el último bit de la derecha indica si puede o no puede saltar, el segundo si puede o no correr, el tercero si puede o no atacar, y el cuarto si puede o no planear. Lo puedes convertir en String y usar CharAt o SubString pero como estamos trabajando en binario usaremos operadores binarios:

Código
  1. # Verificación de habilidades (0 es False, cualquier otro valor es True)
  2. if habilidades_personaje & HABILIDAD_SALTO:
  3.    # 0101 * // 5 (habilidades_personaje)
  4.    # 0001   // 1 (HABILIDAD_SALTO)
  5.    # 0001   // 1 (verdadero)
  6.    print("El personaje puede saltar.")
  7.  
  8. if habilidades_personaje & HABILIDAD_CORRER:
  9.    # 0101 * // 5 (habilidades_personaje)
  10.    # 0010   // 2 (HABILIDAD_CORRER)
  11.    # 0000   // 0 (falso)
  12.    print("El personaje puede correr.")
  13.  
  14. if habilidades_personaje & HABILIDAD_ATACAR:
  15.    # 0101 * // 5 (habilidades_personaje)
  16.    # 0100   // 1 (HABILIDAD_ATACAR)
  17.    # 0100   // 5 (verdadero)
  18.    print("El personaje puede atacar.")
  19.  
  20. if habilidades_personaje & HABILIDAD_PLANEAR:
  21.    # 0101 * // 5 (habilidades_personaje)
  22.    # 1000   // 2 (HABILIDAD_PLANEAR)
  23.    # 0000   // 0 (falso)
  24.    print("El personaje puede planear.")
  25. else:
  26.    print("El personaje no puede planear.")

- Y mira que es interesante que la operación AND te devuelve la Habilidad que estás consultando, así que estás recuperando el valor de la variable, en otros casos devuelve siempre ceros: 0 (False)

---

Bueno, todo esto es trabajar a nivel bit, pero también puedes trabajarlo a nivel variables como pusiste tú:

Citar
HABILIDAD_SALTO = true
HABILIDAD_CORRER = true
HABILIDAD_ATACAR = true
HABILIDAD_PLANEAR = false
Si HABILIDAD_SALTO == true

O utilizar un Array que más o menos se acerca en concepto al nivel bit, más legible pero aparentemente más complejo XD:

Código
  1. HABILIDAD_SALTO = 0;
  2. HABILIDAD_CORRER = 1;
  3. HABILIDAD_ATACAR = 2;
  4. HABILIDAD_PLANEAR = 3;
  5. habilidades_personaje = new Array();
  6.  
  7. habilidades_personaje[HABILIDAD_SALTO] = true;
  8. habilidades_personaje[HABILIDAD_CORRER] = true;
  9. habilidades_personaje[HABILIDAD_ATACAR] = true;
  10. habilidades_personaje[HABILIDAD_PLANEAR] = false;
  11.  
  12. if (habilidades_personaje[HABILIDAD_SALTO] == true) {
  13.  // ...
  14. }

- O si quieres simplificar:

Código
  1. // habilidades_personaje = [0] HABILIDAD_SALTO, [1] HABILIDAD_CORRER, [2] HABILIDAD_ATACAR, [3] HABILIDAD_PLANEAR]
  2. habilidades_personaje = [true, true, true, false];
  3.  
  4. if (habilidades_personaje[0] == true) {
  5.  // ...
  6. }

También puedes crear un "Objeto" en ActionSript 1.0, aunque ya sería demasiado para algo tan simple:

Código
  1. function habilidades_personaje(saltar, correr, atacar, planear) {
  2.  this.HABILIDAD_SALTO = saltar;
  3.  this.HABILIDAD_CORRER = correr;
  4.  this.HABILIDAD_ATACAR = atacar;
  5.  this.HABILIDAD_PLANEAR = planear;
  6. }
  7.  
  8. var habilidades_Pepito = new habilidades_personaje(true, true, true, false);
  9. var habilidades_Jaimito = new habilidades_personaje(false, true, true, false);
  10.  
  11. if (habilidades_Pepito.HABILIDAD_SALTO == true) {
  12.  trace("Pepito puede saltar");
  13. } else {
  14.  trace("Pepito no puede saltar");
  15. }
  16.  
  17. if (habilidades_Jaimito.HABILIDAD_SALTO == true) {
  18.  trace("Jaimito puede saltar");
  19. } else {
  20.  trace("Jaimito no puede saltar");
  21. }
  22.  
  23.  
  24. habilidades_Pepito.HABILIDAD_SALTO = false;
  25. habilidades_Jaimito.HABILIDAD_SALTO = true;
  26.  
  27. if (habilidades_Pepito.HABILIDAD_SALTO == true) {
  28.  trace("Pepito puede saltar");
  29. } else {
  30.  trace("Pepito no puede saltar");
  31. }
  32.  
  33. if (habilidades_Jaimito.HABILIDAD_SALTO == true) {
  34.  trace("Jaimito puede saltar");
  35. } else {
  36.  trace("Jaimito no puede saltar");
  37. }
  38.  

- Devuelve:

Citar
Pepito puede saltar
Jaimito no puede saltar
Pepito no puede saltar
Jaimito puede saltar


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.265


Hackentifiko!


Ver Perfil
Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
« Respuesta #2 en: 23 Mayo 2024, 09:48 am »

Bien, pero entonces, teniendo especialmente en cuenta que es más ágil si todo está en una variable ¿no sería más mejor hacelo así:
Código
  1. HabilidadesDePersonaje = 0101;
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.
? O sea 1 sola variable. Los ifs no sé cómo se harían, yo usaría CharAt pero, quizá por eso no es más ágil, otra manera sería con << o >> (no recuerdo).

Por supuesto en cuanto a lo legible, empeora.

Lo que veo ahora que no había visto es que cuando crea la 5ta no está usando las 4, por eso le da false la habilidad de planear.

Más o menos entendí, pero sigo sin verle mucho sentido, usa 5 variables cuando podría usar 4 o sólo 1.
« Última modificación: 23 Mayo 2024, 10:20 am por Tachikomaia » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.088



Ver Perfil
Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
« Respuesta #3 en: 24 Mayo 2024, 01:32 am »

Citar
Bien, pero entonces, teniendo especialmente en cuenta que es más ágil si todo está en una variable ¿no sería más mejor hacelo así:

Código
  1. HabilidadesDePersonaje = 0101;
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.

Si es exactamente como dices y tal cual pasó con mi ejemplo con Array. PERO cuidado con como le das los números a Flash, 0101 para Flash es 65 porque cualquier número que le des que empiece con 0 implica que está en Base 8 (Octal), si lo vas a usar como String lo tendría que poner entre comillas: "0101", pero como vas a trabajar con números puedes darle directamente 5 que es el binario 0101 pasado a base 10 (Decimal, lo normal)

- Para no perder legibilidad puede ser conveniente comentar o poner el binario pero con su debida forma, dado que no he visto que haya forma de darle binarios literales a Flash como si se puede con Hexadecimal: 0x5, octal: 05, o decimal: 5, se puede utilizar parseInt:


Código
  1. HabilidadesDePersonaje = parseInt("0101", 2);
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.
[/quote]


Citar
? O sea 1 sola variable. Los ifs no sé cómo se harían, yo usaría CharAt pero, quizá por eso no es más ágil, otra manera sería con << o >> (no recuerdo).

Puedes usar cualquier técnica para obtener una posición en particular, si trabajas con String es más conveniente usar charAt o subString, si trabajas con números puedes usar matemática (división entera + residuo entero), pero como andamos con binarios puede llegar a ser mejor usar operadores binarios, como dice se puede usar los desplazamientos para aislar un bit PERO debes estar consiente en el tamaño en bits de la variable, es decir, que la variable sea el binario 0101 implica que para Flash en realidad tienes (por legibilidad lo voy a separar cada cuatro bits pero obviamente es todo junto):

0000 0000 0000 0000 0000 0000 0000 0101

Esto es porque Flash el tamaño de una variable numérica es de 32 bits por eso mismo solo puedes desplazar 0 a 31 posiciones, pues bien, si quiero aislar el tercer bit que corresponde a que si el jugador puede o no atacar (esto si leemos de izquierda a derecha 0101, pero como vez puede llegar a confundirse por lo que siempre es mejor leer de derecha a izquierda en binario, ten esto en consideración), basta con hacer tres desplazamientos, uno para quitar los bits de la derecha, otro para los de la izquierda y otro para regresarlo a su sitio, la parte de regresarlo a su sitio es opcional si solo quieres comprobar si vale diferente a 0, pero si quisieras recuperar el número que representa el binario de atacar: 0100 si lo tendrías que hacer

   0000 0000 0000 0000 0000 0000 0000 0101 >> 2
=  0000 0000 0000 0000 0000 0000 0000 0001

   0000 0000 0000 0000 0000 0000 0000 0001 << 31
1000 0000 0000 0000 0000 0000 0000 0000

   1000 0000 0000 0000 0000 0000 0000 0000 >> (31 - 2)
=  0000 0000 0000 0000 0000 0000 0000 0100


Es algo tedioso hacerlo así, mejor es usar And tal cual se muestra en los ejemplos anteriores porque es hasta más legible ya que usas binarios que se representan por sí mismos: atacar = 0100

   0000 0000 0000 0000 0000 0000 0000 0101 &
                                      0100
=  0000 0000 0000 0000 0000 0000 0000 0100


En ActionScript sería:

Código
  1. HabilidadesDePersonaje = parseInt("0101", 2);
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.
  6.  
  7. // HabilidadesDePersonaje & parseInt("0100", 2) resulta el binario 0100
  8. // y como es diferente de 0 evalúa a True o Verdadero, es una forma de abreviar en lugar de poner: == true
  9. if ( HabilidadesDePersonaje & parseInt("0100", 2) ) {
  10.  trace("El personaje puede Atacar");
  11. } else {
  12.  trace("El personaje no puede Atacar");
  13. }


Citar
Lo que veo ahora que no había visto es que cuando crea la 5ta no está usando las 4, por eso le da false la habilidad de planear.

Más o menos entendí, pero sigo sin verle mucho sentido, usa 5 variables cuando podría usar 4 o sólo 1.

Nunca usa 4 o 5 variables, como ya expliqué en realidad para Flash una variable numérica tiene 32 bit, tu puedes manejarte con hasta esa cantidad de bits, los ceros de la izquierda los puedes omitir pero Flash ya los rellenará con ceros hasta completar 32 bits, solo ten muy presente que es mejor usar los bits de derecha a izquierda para que todo esto no te afecte o confunda, o especificar el binario completo donde si sería más real el poner:

Código
  1. HabilidadesDePersonaje = parseInt("01010000000000000000000000000000", 2);
  2. // El 1er caracter indica si puede planear.
  3. // El 2ndo indica si puede atacar.
  4. // El 3ero si puede correr.
  5. // 4to si puede saltar.

Lo mejor es:

Código
  1. HabilidadesDePersonaje = parseInt("0101", 2);
  2. // El último bit indica si puede planear.
  3. // El penúltimo si puede atacar.
  4. // El  antepenúltimo si puede correr.
  5. // El tras antepenúltimo si puede saltar.

O poner mejor aún poner: El 1er bit desde la derecha, El 2do bit desde la derecha, etc

Todo lo estoy poniendo con parseInt para que sea más legible los bits pero en también puedes usar sus correspondientes números en cualquier otra base porque son exactamente lo mismo tal cual está en los ejemplos anteriores de ChatGPT:

Código
  1. // Definición de habilidades del personaje
  2. //HABILIDAD_SALTO = 1     Salto: 0001 en binario
  3. //HABILIDAD_CORRER = 2   Correr: 0010 en binario
  4. //HABILIDAD_ATACAR = 4    Atacar: 0100 en binario
  5. //HABILIDAD_PLANEAR = 8   Planear: 1000 en binario
  6.  
  7. //Podrá Saltar y Atacar (1 + 4)
  8. HabilidadesDePersonaje = 5;
  9.  
  10. if ( HabilidadesDePersonaje & 4 ) {
  11.  trace("El personaje puede Atacar");
  12. } else {
  13.  trace("El personaje no puede Atacar");
  14. }
En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.265


Hackentifiko!


Ver Perfil
Re: El OR y AND a nivel de bits ¿sólo conviene usarlo para agilizar procesos?
« Respuesta #4 en: 24 Mayo 2024, 02:35 am »

"Nunca usa 4 o 5 variables"
Me refería al ejemplo de GPT.

En conclusión, me parece demasiado lío para algo que me resulta suficientemente bien de otro modo. No se me da bien aprender todo eso.

Me gustó lo de hacer cuentas operando los caracteres de modo independiente y limitando el resultado xD
   329
!+209
-------
   529 -> se pone 9 porque en decimales el máximo es 9, y en esta operación mal no se lleva el sobrante a la izquierda.

   125
!*433
-------
   469 -> 1*4, 2*3, 3*5 limitado a 9

De 2 números obtener el más alto de cada columna y concatenar esos:
8723
9283
------
9783

El númedro más bajo, el promedio... En fin, cosas raras que me podrían servir.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda programa trial solo 10 reinicios para usarlo
Programación General
vtvw 3 2,940 Último mensaje 7 Mayo 2010, 17:44 pm
por vtvw
OpenDNS, ¿Es cierto que conviene usarlo? « 1 2 »
Dudas Generales
Eleкtro 11 10,896 Último mensaje 15 Enero 2013, 15:44 pm
por Aprendiz-Oscuro
Conviene mudarse a 64 bits?
Windows
3l 7u4nk3r 5 3,949 Último mensaje 14 Febrero 2013, 04:50 am
por 3l 7u4nk3r
Operadores a nivel de bits (lenguaje C). « 1 2 »
Programación C/C++
NOB2014 16 9,588 Último mensaje 21 Marzo 2014, 15:16 pm
por Yoel Alejandro
ayuda con operaciones a nivel de bits y mascaras
Programación C/C++
redpeli20 6 2,834 Último mensaje 2 Junio 2015, 11:17 am
por Peregring-lk
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines