2016-02-02 11 views
5

Sto lavorando con alcuni operatori bit a bit e voglio estrarre le ultime 16 cifre binarie di un numero e fare un'operazione con esse. Fondamentalmente voglio vedere un int negativo come 0xFFFFFFFF e quindi estrarre l'LSB FFFF e concatenarli con 0 in modo da ottenere uno zero in modo che assomigli a 0x0000FFFF. Mi interessa solo i numeri negativi più piccoli, quindi l'LSB dovrebbe essere tutte le informazioni di cui ho bisogno.Come ottenere le ultime 16 cifre binarie di un numero negativo e concatenarle?

Ecco il mio approccio in C:

#include <stdio.h> 

int main(){ 
    int a = -1, c = 0; 
    short b = (short)a; 
    printf("a is %x\nb is %x",a,b); 
    c = (0 << 16) | b; 
    printf("\nc is %x\n", c); 
    return 0; 
} 

mio processo di pensiero è che posso convertire il mio int a ad un corto, che sembra FFFF invece di FFFFFFFF avrò un momento migliore. Sfortunatamente per me, viene stampato solo ffffffff per le variabili

+2

il cast in '(breve) a' è inutile perché qualsiasi più ampio il valore verrà automaticamente troncato –

+0

@ LưuVĩnhPhúc grazie. C'è qualche ragione per usare a breve quando si tratta di manipolazione di bit? –

+2

è necessario in alcuni casi ma non in questo caso –

risposta

5

Ciò che non funziona perché l'operatore OR bit a bit (|) imposta qualsiasi bit impostato in uno degli operandi.

Si desidera utilizzare l'operatore AND bit a bit (&) per mascherare i bit che non si desidera. Questo cancella ogni bit che è chiaro in entrambi gli operandi.

Modifica questo:

c = (0 << 16) | b; 

A tal:

c = b & 0xFFFF; 

E l'output sarà:

a is ffffffff 
b is ffffffff 
c is ffff 
+0

quindi per il 16 MSB direi c = b & 0xFFFF0000'? –

+1

@ user3470987 Quasi. Questo ti darà '0xFFFF0000'. Se vuoi '0x0000FFFF' devi fare' c = (unsigned int) (b & 0xFFFF0000) >> 16'. Il cast è necessario per impedire la possibilità che i bit '1' vengano spostati da sinistra. – dbush

Problemi correlati