Sök…


Bitvisa operatörer

Bitvisa operatörer utför operationer på bitvärden för data. Dessa operatörer konverterar operander till signerade 32-bitars heltal i två komplement .

Konvertering till 32-bitars heltal

Antal med mer än 32 bitar kasserar sina mest betydelsefulla bitar. Till exempel konverteras följande heltal med mer än 32 bitar till ett 32-bitars heltal:

Before: 10100110111110100000000010000011110001000001
After:              10100000000010000011110001000001

Två komplement

I normal binär hittar vi det binära värdet genom att lägga till 1 : erna baserat på deras position som krafter på 2 - Den högra biten är 2^0 till den vänstra biten är 2^n-1 där n är antalet bitar. Använd till exempel 4 bitar:

// Normal Binary
// 8 4 2 1
   0 1 1 0  => 0 + 4 + 2 + 0 => 6

Två komplementsformat innebär att talets negativa motsvarighet (6 vs -6) är alla bitarna för ett inverterat nummer, plus ett. De inverterade bitarna av 6 skulle vara:

// Normal binary
   0 1 1 0
// One's complement (all bits inverted)
   1 0 0 1  => -8 + 0 + 0 + 1 => -7
// Two's complement (add 1 to one's complement)
   1 0 1 0  => -8 + 0 + 2 + 0 => -6

Obs: Att lägga till fler 1 till vänster om ett binärt nummer förändrar inte dess värde i två komplement. Värdet 1010 och 1111111111010 är båda -6 .

Bitvis OCH

Den bitvisa OCH-operationen a & b returnerar det binära värdet med en 1 där båda binära operanderna har 1 : er i en specifik position och 0 i alla andra positioner. Till exempel:

13 & 7 => 5
// 13:     0..01101
//  7:     0..00111
//-----------------
//  5:     0..00101 (0 + 0 + 4 + 0 + 1)

Exempel på verklig värld: Number's Parity Check

Istället för detta "mästerverk" (tyvärr för ofta sett i många verkliga koddelar):

function isEven(n) {
    return n % 2 == 0;
}

function isOdd(n) {
    if (isEven(n)) {
        return false;
    } else {
        return true;
    }
}

Du kan kontrollera (heltal) -talets paritet på mycket mer effektivt och enkelt sätt:

if(n & 1) {
    console.log("ODD!");
} else {
    console.log("EVEN!");
}

Bitvis ELLER

Den bitvisa ELLER operation a | b returnerar det binära värdet med en 1 där antingen operander eller båda operanderna har 1 : er i en specifik position, och 0 när båda värdena har 0 i en position. Till exempel:

13 | 7 => 15
// 13:     0..01101
//  7:     0..00111
//-----------------
// 15:     0..01111 (0 + 8 + 4 + 2 + 1)  

Bitvis INTE

Den bitvisa INTE-funktionen ~a vänder bitarna med det givna värdet a . Detta betyder att alla 1 : erna blir 0 : er och alla 0 : erna kommer att bli 1 : er.

~13 => -14
// 13:     0..01101
//-----------------
//-14:     1..10010 (-16 + 0 + 0 + 2 + 0)

Bitvis XOR

Den bitvisa XOR-funktionen ( exklusiv eller ) a ^ b placerar a 1 endast om de två bitarna är olika. Exklusivt eller betyder antingen det ena eller det andra, men inte båda .

13 ^ 7 => 10
// 13:     0..01101
//  7:     0..00111
//-----------------
// 10:     0..01010  (0 + 8 + 0 + 2 + 0)

Exempel på verklig värld: byta två heltal utan ytterligare minnesallokering

var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11

Skiftoperatörer

Bitvis förskjutning kan betraktas som att "flytta" bitarna antingen åt vänster eller höger, och därmed ändra värdet på de data som används.

Vänster Shift

Den vänstra skiftoperatören (value) << (shift amount) kommer att flytta bitarna till vänster med (shift amount) bitar; de nya bitarna som kommer in från höger kommer att vara 0 : er:

5 << 2 => 20
//  5:      0..000101
// 20:      0..010100 <= adds two 0's to the right

Right Shift ( teckenförökande )

Den högra skiftoperatören (value) >> (shift amount) kallas också "Skyltförökande högerskift" eftersom den håller tecknet på den initiala operand. Den högra växlingsoperatören flyttar value den angivna shift amount bitar till höger. Överskottsbitar som flyttas från höger kastas. De nya bitarna som kommer in från vänster kommer att baseras på tecknet på den första operand. Om den vänstra biten var 1 kommer de nya bitarna alla att vara 1 och vice versa för 0 : er.

20 >> 2 => 5
// 20:      0..010100
//  5:      0..000101 <= added two 0's from the left and chopped off 00 from the right

-5 >> 3 => -1
// -5:      1..111011
// -2:      1..111111 <= added three 1's from the left and chopped off 011 from the right

Right Shift ( Nollfyllning )

Den nollfyllda höger växlingsoperatören (value) >>> (shift amount) kommer att flytta bitarna åt höger, och de nya bitarna kommer att vara 0 '. 0 : erna flyttas in från vänster, och överskottet till höger flyttas av och kastas. Detta betyder att det kan göra negativa siffror till positiva.

-30 >>> 2 => 1073741816
//       -30:      111..1100010
//1073741816:      001..1111000

Nollfyllning höger växling och skyltförökande högerskift ger samma resultat för icke-negativa siffror.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow