2009-05-04 2 views
12

Sto provando a scrivere una funzione in assembly (ma lasciamo intendere che il linguaggio non è agevole per la domanda).Come posso impostare tutti i bit su "1" in un numero binario di una dimensione sconosciuta?

Come posso utilizzare gli operatori bit a bit per impostare tutti i bit di un numero passato in 1?

So che posso usare il bit per bit "o" con una maschera con i bit che desidero impostare, ma non so come costruire una maschera basata su un numero binario di dimensione N.

+0

Imposterebbe il valore del numero su "-1" come preferisco? –

+2

Dipende dall'architettura della macchina. Controlla per vedere come viene rappresentato -1. –

+3

-1 perché entrambi i commenti sopra hanno "-1" in essi. ... scherzando. – bsneeze

risposta

48

~ (x & 0)

x & 0 risulterà sempre tra 0 e ~ saranno capovolgere tutti i bit a 1s.

+5

WTF? Perché hai bisogno anche di x? ~ 0 è ciò a cui si riduce, la descrizione lo allude addirittura ("risulterà sempre in 0, ..."). – paxdiablo

+14

@Pax: forse perché la costante 0 potrebbe essere di qualsiasi tipo numerico. Includendo la x si ottiene un contesto (e quindi una dimensione, o più importante numero di bit), a seconda del compilatore. –

+2

Trucco molto bello per ottenere il tipo corretto! +1. –

1

Impostare su -1. Questo è solitamente rappresentato da tutti i bit 1.

+3

Ciò è vero per i numeri interi _signed_ nella maggior parte delle implementazioni che ho visto, ma per essere al sicuro probabilmente utilizzerei il metodo bitwise NOT, ad esempio Sean. – thomasrutter

+0

Non dovresti mai usare mai i tipi firmati quando ti interessa la rappresentazione binaria interna. – Spookbuster

7

Impostarlo su 0, quindi capovolgere tutti i bit su 1 con un bit per bit-NOT.

1

Set x 1

Mentre x < numero x = x * 2

risposta = numero o x - 1.

Il codice presuppone l'input si chiama "numero". Dovrebbe funzionare bene per valori positivi. Nota per i valori negativi che sono due complementari al tentativo di operazione non ha senso in quanto il bit alto sarà sempre uno.

+0

Questo deve essere il modo ottimale per le prestazioni –

6

Scoprirai che in linguaggio assembly hai per conoscere la dimensione di un "numero passato". E in linguaggio assembly è davvero importante quale macchina è il linguaggio assembly.

Dato che le informazioni, si potrebbe chiedere sia

  • Come faccio a impostare un registro intero per tutti i bit a 1?

o

  • Come si compila una regione in memoria con tutti i bit a 1?

Per riempire un registro con tutti i bit a 1, sulla maggior parte delle macchine modo efficiente richiede due istruzioni:

  1. Cancella registro, utilizzando un'istruzione chiara scopi speciali, o carico immediato 0, o xor il registro con se stesso.

  2. Prendere il complemento bit per bit del registro.

riempimento memoria con 1 bit richiede quindi 1 o più istruzioni store ...

troverete molto di più punte bit-giocherellando e trucchi nel meraviglioso libro di Hank Warren Hacker's Delight.