Un approccio per controllare se un dato intero è negativo o non, potrebbe essere questo: (usando operazioni bit)Rilevazione degli interi negativi usando operazioni bit
int num_bits = sizeof(int) * 8; //assuming 8 bits per byte!
int sign_bit = given_int & (1 << (num_bits-1)); //sign_bit is either 1 or 0
if (sign_bit)
{
cout << "given integer is negative"<<endl;
}
else
{
cout << "given integer is positive"<<endl;
}
Il problema di questa soluzione è che il numero di i bit per byte non potevano essere 8, poteva essere 9,10, 11 anche 16 o 40 bit per byte. Byte non significa necessariamente 8 bit! Ad ogni modo, questo problema può essere risolto facilmente scrivendo,
//CHAR_BIT is defined in limits.h
int num_bits = sizeof(int) * CHAR_BIT; //no assumption.
Adesso sembra a posto. Ma è davvero? Questo standard è conforme? Cosa succede se il numero intero negativo non viene rappresentato come complemento a 2? Che cosa succede se è la rappresentazione in un sistema di numerazione binaria che non richiede e richiede solo gli interi negativi per avere 1 nel suo bit più significativo?
Possiamo scrivere un codice che sia compatibile e conforme allo standard?
Argomenti correlati:
Size of Primitive data types
Why is a boolean 1 byte and not 1 bit of size?
Cosa c'è di sbagliato in 'given_int <0'? –
@Chris: niente di sbagliato. solo che volevo farlo "usando operazioni bit". – Nawaz
@Nawaz - Sarò interessato se trovi qualcosa di più veloce dell'operatore '<. Immagino che la maggior parte dei compilatori implementeranno l'operatore "<" come qualunque cosa tu abbia trovato, comunque. Ma grazie. –