2009-05-04 21 views
12

Estoy tratando de escribir una función en el ensamblado (pero supongamos que es independiente del idioma para la pregunta).¿Cómo puedo configurar todos los bits en '1' en un número binario de un tamaño desconocido?

¿Cómo puedo usar operadores bit a bit para establecer todos los bits de un número pasado en 1?

Sé que puedo usar el bit "o" con una máscara con los bits que deseo establecer, pero no sé cómo construir una máscara basada en un número binario de N tamaño.

+0

¿Establecer el valor del número a "-1" hacer lo que quiera? –

+2

Depende de la arquitectura de la máquina. Compruebe para ver cómo -1 está representado. –

+3

-1 porque ambos comentarios anteriores tienen "-1" en ellos. ... bromeando. – bsneeze

Respuesta

48

~ (x & 0)

x 0 & siempre resultará en 0, y le dará la vuelta ~ todos los bits a 1 s.

+5

WTF? ¿Por qué incluso necesitas x? ~ 0 es a lo que se reduce, tu descripción incluso alude a ella ("siempre dará como resultado 0, ..."). – paxdiablo

+14

@Pax: quizás porque la constante 0 podría ser de cualquier tipo numérico. Incluir la x proporciona un contexto (y por lo tanto un tamaño, o más importante, un conteo de bits), según el compilador. –

+2

¡Muy buen truco para obtener el tipo correcto! +1. –

1

Configúrelo en -1. Esto generalmente se representa con todos los bits siendo 1.

+3

Esto es cierto para _signed_ integers en la mayoría de las implementaciones que he visto, pero para estar seguro, probablemente usaría el método bitwise NOT, por ejemplo, de Sean. – thomasrutter

+0

También nunca debe usar tipos firmados cuando se preocupa por la representación binaria interna. – Spookbuster

7

Ajústelo a 0, luego invierta todos los bits a 1 con un NO bit a bit.

1

conjunto X a 1

Mientras x < número x = x * 2

respuesta = número o x - 1.

El código asume que su entrada se llama "número". Debería funcionar bien para valores positivos. La nota para los valores negativos que son dos complementan el intento de operación no tiene sentido ya que el bit alto siempre será uno.

+0

Esa debe ser la forma óptima de rendimiento –

6

Encontrará que en el lenguaje de ensamblaje tiene para saber el tamaño de un "número pasado". Y en lenguaje ensamblador, realmente es importante para qué máquina es el lenguaje ensamblador.

Teniendo en cuenta esta información, se puede preguntar ya sea

  • ¿Cómo se configura un registro entero para todos los bits 1?

o

  • ¿Cómo completo una región en la memoria con todos los bits 1?

para llenar un registro con todos los bits 1, en la mayoría de las máquinas de la manera eficiente toma dos instrucciones:

  1. claras del registro, utilizando una instrucción clara de propósito especial, o la carga inmediata 0, o xor el registro consigo mismo.

  2. Tome el complemento bit a bit del registro.

memoria Carga de bits 1 a continuación, requiere 1 o más almacenar las instrucciones ...

Usted encontrará muchos más consejos de bits haciendo girar y trucos en el maravilloso libro Hacker's Delight de Hank Warren.

Cuestiones relacionadas