Share via


_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);
}
          
        

Voir aussi

Référence

intrinsèques du compilateur