Cracking the coding interview--Q5.6

1540 단어
제목.
텍스트:
Write a program to swap odd and even bits in an integer with as few instructions as possible (e.g., bit 0 and bit 1 are swapped, bit 2 and bit 3 are swapped, etc).
번역:
쓰기 프로그램은 가능한 한 적은 지령을 사용하여 정수의 2진법의 짝짓기 비트를 교환한다. (예:bit 0비트와bit 1위 교환,bit 2위와bit 3비트 교환 등)
해답하다
각각 이 정수의 홀수와 짝수를 추출한 다음에 위치를 바꾸거나 바꾸면 된다.
코드는 다음과 같습니다.
public static int swap_bits(int x){
	return ((x&0x55555555)<<1)|((x>>1)&0x55555555);
}

물론 더 자연스러운 방식으로 이 코드를 쓸 수도 있다.
public static int swap_bits1(int x){
	return ((x&0x55555555)<<1)|((x&0xAAAAAAAA)>>1);
}

위의 코드 사고방식과 작용은 모두 같지만 이라는 책에 따르면 첫 번째 방법은 하나의 레지스터에서 두 개의 큰 상수를 생성하는 것을 피했다.만약 컴퓨터에 비지령이 없다면 두 번째 방법은 1개의 지령을 더 사용하게 될 것이다.총괄적으로 말하면 첫 번째 방법이 더 좋다.(참조:http://hawstein.com/posts/5.6.html)
전체 코드는 다음과 같습니다.
class Q5_6{
	public static void print_binary(int x){
		String s="";
		for(int i=0;i<32&&x!=0;++i,x>>=1){
			if((x&1)==1) s="1"+s;
			else s="0"+s;
		}
		System.out.println(s);
	}
	public static int swap_bits(int x){
		return ((x&0x55555555)<<1)|((x>>1)&0x55555555);
	}
	public static int swap_bits1(int x){
		return ((x&0x55555555)<<1)|((x&0xAAAAAAAA)>>1);
	}
	public static void main(String[] args){
		int x = -7665543;
		print_binary(x);
		print_binary(swap_bits(x));
		print_binary(swap_bits1(x));
	}
}

---EOF---

좋은 웹페이지 즐겨찾기