2013-04-10 21 views
7

Java'da iki bit takas etmek için kullanabileceğim yerleşik bir işlev var mı? ÖrneğinJava'da iki bitlik tamsayı nasıl değiştirebilirim?

:

_ _ _ _ 1 _ _ 0 bit 3 bit 0 ile takas ve _ _ _ _ 0 _ _ 1

Uzun bir prosedür kullanılarak yapılabilir biliyorum olur bit-bilge operasyon, ama bunu yapmaktan kaçınmak istiyorum.

+0

Ne zamandır olmasın istiyoruz bu şekilde deneyebilirsiniz? Özellikle bitleri değiştiren bir yerleşik olduğunu sanmıyorum. – iamnotmaynard

+0

böyle bir işlev mevcut değil – BlackJoker

+2

"Uzun işlem bit uzun işlem" uzun sürecek olsa da, gitmenin yolu. –

cevap

5

Ben ayrıntılarda onu uyguluyorum ama

int temp1 = (i & 0x1) << 3; //extract lowest bit #1 and place at pos# 4 
int temp2 = (i & 0x8) >> 3; //extract bit #4 and place at pos #1 
i = (i & temp1) | (i & ~temp1); //now pos #4 is ready  
i = (i & temp2) | (i & ~temp2); //now pos #1 is ready 
7

İşte alternatif bir yoldur, bir delta-takas denilen tek bir çizgi haline katılabilir. daha genel

int t = (i^(i >> 3)) & 1; 
return i^t^(t << 3); 

Veya:

static int swap(int x, int i, int j) 
{ 
    // precondition: i > j 
    int d = i - j; 
    int y = (x^(x >> d)) & (1 << j); 
    return x^y^(y << d); 
} 
10

Ayrıca

//positions are indexed from 0 and in order ...[4][3][2][1][0] 
//so changing 3 and 1 will make    ...[4][1][2][3][0] 
public static int swap(int i, int pos1, int pos2) { 

    int bit1 = (i >> pos1) & 1;// bit at pos1 
    int bit2 = (i >> pos2) & 1;// bit at pos2 

    if (bit1 == bit2) 
     return i; // no need to swap since we change 1 with 1 or 0 with 0 

    // Since we are here it means that we need to change 1->0 and 0->1. 
    // To do this we can use XOR (^). 
    // Lets create mask 000001010 with ones at specified positions 
    int mask = (1 << pos1) | (1 << pos2); 

    return i^mask;// TADAM!!! 
}