Frage Setze Bit X einer Ganzzahl auf Bit Y einer anderen Ganzzahl ohne Verzweigung?


Kann das copy_bit Funktion unten vereinfacht zu etwas wie out[out_bit] = in[in_bit]? (d. h. keine Verwendung eines if Erklärung)

template< typename T >
inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
{
    if ( (in & (1 << in_bit)) != 0 )
    {
        out |= (1 << out_bit); // Set bit
    }
    else
    {
        out &= ~(1 << out_bit); // Clear bit
    }
}

// Set bit 4 in x to bit 11 in y
copy_bit( x, y, 4, 11 );

Aktualisieren: Nur um klar zu sein, das ist keine Hausaufgabe oder ein XY-Problem, wo es vorschlägt std::bitset Beantwortet die Frage.


7
2017-08-11 05:24


Ursprung


Antworten:


Du kannst es so machen:

//Change the bit if and only if they are not equal:
out ^= (((out >> out_bit) ^ (in >> in_bit)) & 1) << out_bit;

(Verschiebe beide Werte so, dass die benötigten Bits mit >> in der niedrigstwertigen Position liegen, wähle mit & nur das untere Bit des Ergebnisses der ^ Operation; verschiebe dann das Ergebnis in Position eines ansonsten Null-Wertes nach ^ mit der ursprüngliches Ziel. Das Ergebnis ist das gleiche wie das Kopieren des Bits in_bit von in in bit out_bit von out.)


9
2017-08-11 05:39



Eine Möglichkeit, dies in einer Zeile zu tun, wäre, zuerst das Ausgangsbit auf Null zurückzusetzen und dann ODER es mit einem beliebigen Bit zu verknüpfen in Nummer hat:

(out &= ~(1 << out_bit)) |= (((in >> in_bit) & 1) << out_bit)

6
2017-08-11 05:45



Versuche dies:

template< typename T >
inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
{
    out = (out & ~(1 << out_bit)) | (((in & (1 << in_bit)) >> in_bit) << out_bit);
}

Erläuterung:

  • (out & ~(1 << out_bit)) lass die Bits von out das ist nicht interessant.
  • (in & (1 << in_bit) Wählen Sie das Bit aus in das ist interessant
  • (((in & (1 << in_bit)) >> in_bit) << out_bit) Positionieren Sie das Bit in der richtigen Position.

4
2017-08-11 05:44