2013-04-10 34 views
7

Có một hàm dựng sẵn trong Java mà tôi có thể sử dụng để trao đổi hai bit không?Làm thế nào tôi có thể trao đổi hai bit của số nguyên trong Java?

Ví dụ:

_ _ _ _ 1 _ _ 0 bit 3 hoán đổi với bit 0 và trở thành _ _ _ _ 0 _ _ 1

Tôi biết nó có thể được thực hiện bằng một thủ tục dài hoạt động bit-khôn ngoan, nhưng tôi muốn tránh làm như vậy.

+0

bao lâu bạn muốn nó không? Tôi không nghĩ rằng có một built-in mà cụ thể hoán đổi bit. – iamnotmaynard

+0

không tồn tại chức năng như vậy – BlackJoker

+2

"Thủ tục dài của hoạt động bit-khôn ngoan" là con đường để đi, mặc dù nó có thể sẽ không được lâu dài. –

Trả lời

5

Tôi đang làm cho nó trong chi tiết, nhưng bạn có thể tham gia vào dòng

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

Dưới đây là một cách khác, được gọi là delta-swap.

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

Hoặc tổng quát hơn:

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

Bạn cũng có thể thử cách này

//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!!! 
} 
Các vấn đề liên quan