Risposte:
In C, se vuoi nascondere la manipolazione dei bit, puoi scrivere una macro:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
e usalo in questo modo per controllare l' ennesimo bit dall'estremità destra:
CHECK_BIT(temp, n - 1)
In C ++, puoi usare std :: bitset .
!= 0
è tutto vero, quindi perché preoccuparsi? 1
è esattamente vero come 0.1415
!
std::bitset
, davvero? Certo, piuttosto che fare un po 'di lavoro (e potenzialmente alcuni modelli davvero carini) per controllare un singolo bit, usa un contenitore gonfio che memorizza (nella mia implementazione) ogni "bit" in un altro inutilizzato unsigned long
. Che spreco di spazio!
Verificare se il bit N (a partire da 0) è impostato:
temp & (1 << N)
Non esiste una funzione incorporata per questo.
1 << 0
?? Scusa, confuso.
1<<0
, che è 1 senza alcun turno (turno 0), che è1<<0 == 1
Vorrei solo usare uno std :: bitset se è C ++. Semplice. Straight-forward. Nessuna possibilità di errori stupidi.
typedef std::bitset<sizeof(int)> IntBits;
bool is_set = IntBits(value).test(position);
o che ne dici di questa stupidità
template<unsigned int Exp>
struct pow_2 {
static const unsigned int value = 2 * pow_2<Exp-1>::value;
};
template<>
struct pow_2<0> {
static const unsigned int value = 1;
};
template<unsigned int Pos>
bool is_bit_set(unsigned int value)
{
return (value & pow_2<Pos>::value) != 0;
}
bool result = is_bit_set<2>(value);
std::bitset<CHAR_BIT * sizeof(int)>
per essere ancora più corretto
Sì, lo so che non "devo" farlo in questo modo. Ma di solito scrivo:
/* Return type (8/16/32/64 int size) is specified by argument size. */
template<class TYPE> inline TYPE BIT(const TYPE & x)
{ return TYPE(1) << x; }
template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y)
{ return 0 != (x & y); }
Per esempio:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
Tra le altre cose, questo approccio:
Quello che sta facendo la risposta selezionata è effettivamente sbagliato. La funzione seguente restituirà la posizione del bit o 0 a seconda che il bit sia effettivamente abilitato. Questo non è ciò che chiedeva il poster.
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
Ecco cosa cercava originariamente il poster. La funzione seguente restituirà 1 o 0 se il bit è abilitato e non la posizione.
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
bool has_feature = CHECK_BIT(register, 25);
Buono a sapersi che potrei farlo senza la doppia negazione.
Secondo questa descrizione dei campi di bit , esiste un metodo per definire e accedere direttamente ai campi. L'esempio in questa voce va:
struct preferences {
unsigned int likes_ice_cream : 1;
unsigned int plays_golf : 1;
unsigned int watches_tv : 1;
unsigned int reads_books : 1;
};
struct preferences fred;
fred.likes_ice_cream = 1;
fred.plays_golf = 1;
fred.watches_tv = 1;
fred.reads_books = 0;
if (fred.likes_ice_cream == 1)
/* ... */
Inoltre, c'è un avviso lì:
Tuttavia, i membri di bit nelle strutture presentano svantaggi pratici. Innanzitutto, l'ordine dei bit in memoria dipende dall'architettura e le regole di riempimento della memoria variano da compilatore a compilatore. Inoltre, molti compilatori popolari generano codice inefficiente per la lettura e la scrittura di membri di bit, e ci sono problemi di sicurezza dei thread potenzialmente gravi relativi ai campi di bit (specialmente su sistemi multiprocessore) a causa del fatto che la maggior parte delle macchine non può manipolare set arbitrari di bit in memoria, ma deve invece caricare e memorizzare intere parole.
Puoi utilizzare un Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
Usa std :: bitset
#include <bitset>
#include <iostream>
int main()
{
int temp = 0x5E;
std::bitset<sizeof(int)*CHAR_BITS> bits(temp);
// 0 -> bit 1
// 2 -> bit 3
std::cout << bits[2] << std::endl;
}
temp
necessario riflettere il valore per renderlo "big-endian"?
C'è, vale a dire l' istruzione intrinseca _bittest .
Io uso questo:
#define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
dove "pos" è definito come 2 ^ n (ig 1,2,4,8,16,32 ...)
Restituisce: 1 se vero 0 se falso
4 = 2^(3-1)
per la posizione del bit 3 poiché faceva parte della domanda.
stavo cercando di leggere un numero intero a 32 bit che definiva i flag per un oggetto nei PDF e questo non funzionava per me
ciò che ha risolto stava cambiando la definizione:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
l'operando & restituisce un numero intero con i flag che hanno entrambi in 1, e non è stato trasmesso correttamente in booleano, questo ha funzionato
!= 0
farebbe lo stesso. Non so come potrebbero differire le istruzioni della macchina generate.
Puoi "simulare" lo spostamento e il mascheramento: if ((0x5e / (2 * 2 * 2))% 2) ...
Perché non usare qualcosa di così semplice come questo?
uint8_t status = 255;
cout << "binary: ";
for (int i=((sizeof(status)*8)-1); i>-1; i--)
{
if ((status & (1 << i)))
{
cout << "1";
}
else
{
cout << "0";
}
}
USCITA: binario: 11111111
std::cout << (((status & (1 << i)) ? '1' : '0');
. Dovresti usare la CHAR_BIT
costante da <climits>
invece di codificare 8 bit, anche se in questo caso sai che il risultato sarà comunque 8 poiché stai usando unuint8_t
se vuoi solo un vero modo hard coded:
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
nota questo hw dipendente e assume che questo ordine di bit 7654 3210 e var sia 8 bit.
#include "stdafx.h"
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
int _tmain(int argc, _TCHAR* argv[])
{
int temp =0x5E;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x00;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x04;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0xfb;
printf(" %d \n", IS_BIT3_SET(temp));
scanf("waitng %d",&temp);
return 0;
}
Risultati in:
1 0 1 0
Anche se ora è abbastanza tardi per rispondere, c'è un modo semplice per scoprire se l'ennesimo bit è impostato o meno, semplicemente usando gli operatori matematici POWER e MODULUS.
Supponiamo di voler sapere se 'temp' ha l'ennesimo bit impostato o meno. La seguente espressione booleana restituirà true se il bit è impostato, 0 in caso contrario.
Considera il seguente esempio:
Se voglio sapere se il terzo bit è impostato o meno, ottengo
Quindi l'espressione restituisce vero, indicando che il terzo bit è impostato.
Un approccio verificherà la seguente condizione:
if ( (mask >> bit ) & 1)
Un programma di spiegazione sarà:
#include <stdio.h>
unsigned int bitCheck(unsigned int mask, int pin);
int main(void){
unsigned int mask = 6; // 6 = 0110
int pin0 = 0;
int pin1 = 1;
int pin2 = 2;
int pin3 = 3;
unsigned int bit0= bitCheck( mask, pin0);
unsigned int bit1= bitCheck( mask, pin1);
unsigned int bit2= bitCheck( mask, pin2);
unsigned int bit3= bitCheck( mask, pin3);
printf("Mask = %d ==>> 0110\n", mask);
if ( bit0 == 1 ){
printf("Pin %d is Set\n", pin0);
}else{
printf("Pin %d is not Set\n", pin0);
}
if ( bit1 == 1 ){
printf("Pin %d is Set\n", pin1);
}else{
printf("Pin %d is not Set\n", pin1);
}
if ( bit2 == 1 ){
printf("Pin %d is Set\n", pin2);
}else{
printf("Pin %d is not Set\n", pin2);
}
if ( bit3 == 1 ){
printf("Pin %d is Set\n", pin3);
}else{
printf("Pin %d is not Set\n", pin3);
}
}
unsigned int bitCheck(unsigned int mask, int bit){
if ( (mask >> bit ) & 1){
return 1;
}else{
return 0;
}
}
Produzione:
Mask = 6 ==>> 0110 Pin 0 is not Set Pin 1 is Set Pin 2 is Set Pin 3 is not Set
#define CHECK_BIT(var,pos) ((var>>pos) & 1)
pos - Posizione del bit a partire da 0.
restituisce 0 o 1.
Faccio questo:
LATGbits.LATG0 = ((m & 0x8)> 0); // per verificare se il bit-2 di m è 1