int temp = 0x5E; // in binary 0b1011110.
Existe-t-il un moyen de vérifier si le bit 3 de temp est 1 ou 0 sans décalage de bit ni masquage.
Je veux juste savoir s'il existe une fonction intégrée pour cela, ou suis-je obligé d'en écrire une moi-même.
c++
c
bit-manipulation
Milan
la source
la source
!= 0
est vrai, alors pourquoi s'embêter?1
est exactement aussi vrai que0.1415
!std::bitset
, vraiment? Bien sûr, plutôt que de faire un tout petit peu de travail (et potentiellement de très bons modèles) pour vérifier un seul bit, utilisez un conteneur gonflé qui stocke (sur mon implémentation) chaque 'bit' dans un autre inutiliséunsigned long
. Quelle perte d'espace!Vérifiez si le bit N (à partir de 0) est activé:
Il n'y a pas de fonction intégrée pour cela.
la source
1 << 0
?? Désolé, confus.1<<0
1 sans décalage (décalage 0), ce qui est1<<0 == 1
J'utiliserais juste un std :: bitset si c'est C ++. Facile. Simple. Aucune chance pour des erreurs stupides.
ou que diriez-vous de cette sottise
la source
std::bitset<CHAR_BIT * sizeof(int)>
pour être encore plus correctCe que fait la réponse choisie est en fait faux. La fonction ci-dessous renverra la position du bit ou 0 selon que le bit est réellement activé. Ce n'est pas ce que demandait l'affiche.
Voici ce que l'affiche recherchait à l'origine. La fonction ci-dessous renverra un 1 ou un 0 si le bit est activé et non la position.
la source
bool has_feature = CHECK_BIT(register, 25);
Bon à savoir que je pourrais le faire sans la double négation.Ouais, je sais que je ne suis pas « avoir » le faire de cette façon. Mais j'écris habituellement:
Par exemple:
Entre autres, cette approche:
Par exemple: #define ABS (X) (((X) <0)? - (X): (X))
ABS (i ++);
la source
Selon cette description des champs de bits , il existe une méthode pour définir et accéder directement aux champs. L'exemple de cette entrée va:
En outre, il y a un avertissement là-bas:
la source
Vous pouvez utiliser un Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
la source
Utilisez std :: bitset
la source
temp
n'a- t-elle pas besoin d'être reflétée pour la rendre "big-endian"?Il y a, à savoir l' instruction intrinsèque _bittest .
la source
J'utilise ceci:
où "pos" est défini comme 2 ^ n (ig 1,2,4,8,16,32 ...)
Renvoie: 1 si vrai 0 si faux
la source
4 = 2^(3-1)
pour la position de bit 3 car cela faisait partie de la question.J'essayais de lire un entier 32 bits qui définissait les indicateurs d'un objet dans les PDF et cela ne fonctionnait pas pour moi
ce qui a corrigé c'était de changer la définition:
l'opérande & renvoie un entier avec les indicateurs qui ont tous les deux en 1, et il n'a pas été converti correctement en booléen, cela a fait l'affaire
la source
!= 0
ferait de même. Je ne sais pas en quoi les instructions machine générées peuvent différer.Vous pouvez "simuler" le décalage et le masquage: if ((0x5e / (2 * 2 * 2))% 2) ...
la source
Pour la solution spécifique x86 de bas niveau, utilisez l' opcode x86 TEST .
Votre compilateur devrait cependant transformer _bittest en ceci ...
la source
Pourquoi ne pas utiliser quelque chose d'aussi simple que cela?
SORTIE: binaire:
11111111
la source
std::cout << (((status & (1 << i)) ? '1' : '0');
. Vous devriez utiliser laCHAR_BIT
constante de<climits>
au lieu de coder en dur 8 bits, mais dans ce cas, vous savez que le résultat sera de toute façon 8 puisque vous utilisez unuint8_t
si vous voulez juste un vrai moyen codé en dur:
notez cette hw dépendant et suppose que cet ordre de bits 7654 3210 et var est de 8 bits.
Résulte en:
1 0 1 0
la source
Bien qu'il soit assez tard pour répondre maintenant, il existe un moyen simple de trouver si le Nième bit est défini ou non, en utilisant simplement les opérateurs mathématiques POWER et MODULUS.
Disons que nous voulons savoir si «temp» a un Nième bit défini ou non. L'expression booléenne suivante donnera vrai si le bit est défini, 0 sinon.
Prenons l'exemple suivant:
Si je veux savoir si le 3ème bit est activé ou non, j'obtiens
L'expression renvoie donc vrai, indiquant que le 3ème bit est défini.
la source
Une approche consistera à vérifier dans la condition suivante:
Un programme d'explication sera:
Production:
la source
pos - Position de bit commençant à 0.
renvoie 0 ou 1.
la source
Je fais ceci:
LATGbits.LATG0 = ((m & 0x8)> 0); // pour vérifier si le bit-2 de m est 1
la source
le moyen le plus rapide semble être une table de recherche pour les masques
la source