DarwinBotsManual
Abrir la app EnglishEN

Bit a bit

Los operadores que miran un número como 32 bits: y, o, o exclusivo, inversión, corrimientos, más uno y menos uno, y el cambio de signo.

Costo: Comando de bits

OperadorQué hace
~Invierte todos los bits del número del tope: x ~ deja −x − 1, así que 5 ~ da −6 y 0 ~ da −1.
&Y bit a bit de los dos números del tope: deja prendidos solo los bits que están prendidos en los dos. Sirve para consultar y apagar marcas.
|O bit a bit de los dos números del tope: deja prendido cada bit que esté prendido en alguno de los dos. Sirve para prender marcas.
^O exclusivo bit a bit de los dos números del tope: deja prendidos los bits que están en uno solo de los dos. Sirve para dar vuelta marcas.
++Suma 1 al número del tope de la pila entera, sin tocar la memoria: 5 ++ deja 6.
--Resta 1 al número del tope de la pila entera, sin tocar la memoria: 5 -- deja 4 y 0 -- deja −1.
-El signo menos suelto le cambia el signo al número del tope: 5 - deja −5. No resta; para restar está sub.
<<Corre los bits del número del tope un lugar a la izquierda, o sea lo multiplica por 2: 5 << deja 10.
>>Corre los bits del número del tope un lugar a la derecha conservando el signo: divide por 2 redondeando hacia abajo, así que 7 >> deja 3 y −5 >> deja −3.

Estos operadores trabajan, como los básicos, solo con la pila entera: sacan uno o dos números y dejan uno. La diferencia es que ven cada número como una fila de 32 bits (en complemento a dos, la forma habitual de guardar negativos) y operan bit por bit.

El uso más común es guardar varias marcas de sí o no en una sola celda de memoria, una por bit: | con una potencia de 2 prende un bit, ~ y & lo apagan, y & solo pregunta si está prendido. Una celda guarda hasta ±32000, así que caben sin problemas 14 marcas (los bits de valor 1, 2, 4… hasta 8192). La de 16384 entra solo si la suma no pasa de 32000.

Este bot tiene un 1 en la celda 50 (el bit de valor 1). Cuando su edad llega a 5 prende el de valor 4 y la celda pasa a 5; a los 10 lo apaga y vuelve a 1, sin tocar el otro bit:

' prende el bit de valor 4 de la celda 50 y después lo apaga
cond
  *.robage 5 =
start
  *50 4 | 50 store
stop

cond
  *.robage 10 =
start
  *50 4 ~ & 50 store
stop

Para preguntar por la marca, *50 4 & 0 != deja verdadero si el bit está prendido (ver !=).

Ninguno falla con la pila vacía: operan sobre ceros. En el borde de los 32 bits hay dos rarezas heredadas del DarwinBots 2.48.32 (un resultado que debería ser el negativo más grande sale como 0); las cuentan ++ y <<. Con números del tamaño de la memoria nunca vas a llegar ahí.

Cada operador de esta familia que se ejecuta cobra el costo Comando de bits de la configuración del escenario. El panorama de todas las familias está en Los operadores por familia.