_bittestandset, _bittestandset64
[Cette documentation constitue un aperçu et peut faire l'objet de modifications avec les versions ultérieures. Blank topics are included as placeholders.]
Spécifique à Microsoft
Générez l'instruction d' bts , qui examine le bit b de l'adresse a, retourne sa valeur actuelle, et définit le bit en 1.
unsigned char _bittestandset(
long *a,
long b
);
unsigned char _bittestandset64(
__int64 *a,
__int64 b
);
Paramètres
[in, out] a
Un pointeur vers la mémoire à examiner.[in] b
La position de bits à tester.
Valeur de retour
le bit à la position spécifiée.
Configuration requise
Intrinsèque |
Architecture |
---|---|
_bittestandset |
x86, IPF, x64 |
_bittestandset64 |
IPF, x64 |
Fichier d'en-tête <intrin.h>
Notes
Sur l'architecture IPF, l'instruction d' bts est pas disponible, cette intrinsèque est une fonction personnalisée qui imite le comportement d' bts. Cette fonction personnalisée peut être plus lente qu'une fonction inline encre car elle inclut la charge mémoire, telles que la gestion le cas où b est négatif, qui peut être inutile dans des cas spécifiques.
Cette routine est uniquement disponible sous forme intrinsèque.
Exemple
// bittestandset.cpp
// processor: x86, IPF, x64
// This example uses several of the _bittest family of intrinsics
// to implement a Flags class that allows bit level access to an
// integer field.
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(_bittestandset, _bittestandreset,\
_bittestandcomplement, _bittest)
class Flags
{
private:
long flags;
long* oldValues;
public:
Flags() : flags(0)
{
oldValues = new long[32];
}
~Flags()
{
delete oldValues;
}
void SetFlagBit(long nBit)
{
// We omit range checks on the argument
oldValues[nBit] = _bittestandset(&flags, nBit);
printf_s("Flags: 0x%x\n", flags);
}
void ClearFlagBit(long nBit)
{
oldValues[nBit] = _bittestandreset(&flags, nBit);
printf_s("Flags: 0x%x\n", flags);
}
unsigned char GetFlagBit(long nBit)
{
unsigned char result = _bittest(&flags, nBit);
printf_s("Flags: 0x%x\n", flags);
return result;
}
void RestoreFlagBit(long nBit)
{
if (oldValues[nBit])
oldValues[nBit] = _bittestandset(&flags, nBit);
else
oldValues[nBit] = _bittestandreset(&flags, nBit);
printf_s("Flags: 0x%x\n", flags);
}
unsigned char ToggleBit(long nBit)
{
unsigned char result = _bittestandcomplement(&flags, nBit);
printf_s("Flags: 0x%x\n", flags);
return result;
}
};
int main()
{
Flags f;
f.SetFlagBit(1);
f.SetFlagBit(2);
f.SetFlagBit(3);
f.ClearFlagBit(3);
f.ToggleBit(1);
f.RestoreFlagBit(2);
}