2015-04-22 1 views
1

Je jouais juste un peu (sans jeu de mots) avec std::bitset en C++ et j'ai couru vers un problème.Impossible d'utiliser le décalage gauche ou droit

Je peux utiliser OR, AND et EXCLUSIVE OR très bien, mais lorsque je tente de faire des opérations de décalage en utilisant >> et << je reçois une erreur disant

Error: no operator "<<" matches these operands

Le code je ressemble à ceci:

#include <iostream> 
#include <bitset> 

using namespace std; 

int main() 
{ 
    bitset<8> test = 0x05; 
    bitset<8> test2 = 0x00; 
    bitset<8> lshift = test << test2; 
    cout<<lshift<<endl; 
    system("PAUSE"); 
    return 0; 
} 
+0

Vous n'avez pas plus de code? Parce que je ne vois pas >> >> 'dans votre code – Morb

+0

Oh, désolé. C'est censé dire << dans l'erreur. Je vais l'éditer –

+1

Vraisemblablement vous vouliez 'test << test2.to_ulong();' – user657267

Répondre

3

Il n'y a tout simplement pas d'opérateur de ce type défini pour déplacer un std::bitset par un autre std::bitset. Les seuls opérateurs de décalage sont définis pour les arguments de type std::size_t, voir par exemple http://en.cppreference.com/w/cpp/utility/bitset/operator_ltltgtgt.

+0

Ok, merci. J'ai juste supposé que vous pourriez utiliser un bitet pour décaler un autre bitet –

2

Vous pouvez toujours écrire l'opérateur vous-même si vous le voulez vraiment. De préférence basé sur un modèle bien :)

#include <iostream> 
#include <bitset> 

using namespace std; 

bitset<8> operator<<(bitset<8>& rhs, bitset<8>& lhs) { 
    return rhs << (std::size_t)lhs.to_ulong(); 
} 

int main() 
{ 
    bitset<8> test = 0x01; 
    bitset<8> test2 = 0x01; 
    bitset<8> lshift = test << test2; 
    cout << lshift << endl; 
    return 0; 
} 
0

Cet opérateur n'est pas défini pour la bitset Cependant, la classe a l'opérateur membre suivant

bitset<N> operator<<(size_t pos) const noexcept; 

tout ce que vous avez besoin pour que le changement fonctionnerait est de remplacer test2 pour test2.to_ulong()

bitset<8> lshift = test << test2.to_ulong(); 

Voici un programme démonstratif

#include <iostream> 
#include <bitset> 

const size_t N = 8; 

int main() 
{ 
    std::bitset<N> test = 0x05; 
    std::bitset<N> test2 = 0x01; 
    std::bitset<N> lshift = test << test2.to_ulong(); 

    std::cout << lshift << std::endl; 

    return 0; 
} 

La sortie est

00001010