๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/Algorithm

[Java] ์ž๋ฐ”์˜ ์ด์ง„ ์—ฐ์‚ฐ(๋น„ํŠธ ์—ฐ์‚ฐ)

728x90
๋ฐ˜์‘ํ˜•
OR ์—ฐ์‚ฐ๊ณผ AND ์—ฐ์‚ฐ

OR ์—ฐ์‚ฐ์€ ์ด์ง„์ˆ˜์˜ ๊ฐ ์ž๋ฆฌ์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ผ๋„ 1์ด๋ฉด ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๋Š” 1, ์•„๋‹ˆ๋ฉด 0์„ ๋ฆฌํ„ด

AND ์—ฐ์‚ฐ์€ ์ด์ง„์ˆ˜์˜ ๊ฐ ์ž๋ฆฌ์ˆ˜ ๋ชจ๋‘๊ฐ€ 1์ด๋ฉด ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๋Š” 1, ์•„๋‹ˆ๋ฉด 0์„ ๋ฆฌํ„ด

 public static void main(String []args) {
    int n1 = 4; // 100
    int n2 = 5; // 101

    // OR ์—ฐ์‚ฐ
    int n3 = n1 | n2;   // 101 -> 5
    // AND ์—ฐ์‚ฐ
    int n4 = n1 & n2;   // 100 -> 4

    System.out.println(n3);
    System.out.println(n4);
 }

 

์‹œํ”„ํŠธ ์—ฐ์‚ฐ

์ด์ง„์ˆ˜์˜ ๋น„ํŠธ๋ฅผ ์›ํ•˜๋Š” ๊ฐ’๋งŒํผ ์ด๋™์‹œํ‚ค๋Š” ์—ฐ์‚ฐ

 public static void main(String []args) {
    int n1 = 4; // 100
    int n2 = 5; // 101

    // << ์™ผ์ชฝ ์‹œํ”„ํŠธ
    int n3 = n1 << 2;   // 100์„ ์™ผ์ชฝ์œผ๋กœ ๋‘์ž๋ฆฌ๋งŒํผ ์ด๋™ -> 10000(16)

    // >> ์˜ค๋ฅธ์ชฝ ์‹œํ”„ํŠธ
    int n4 = n2 >> 1;   // 101์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ์ž๋ฆฌ๋งŒํผ ์ด๋™ -> 10(2)

    System.out.println(n3);
    System.out.println(n4);
 }

 

์ด์ง„์ˆ˜ ๋ฌธ์ž์—ด์„ int๋กœ ๋ณ€ํ™˜
public static void main(String []args) {
    int n = stringToInt("100"); // 4
    System.out.println(n);
    n = stringToInt("101"); // 5
    System.out.println(n);
 }

// ์ด์ง„์ˆ˜ ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ int๋กœ ๊ณ„์‚ฐ
static int stringToInt(String bitString) {
	int result = 0;
	for(int i=0; i<bitString.length(); i++) {
		if(bitString.charAt(i) == '1') {
        	// OR ์—ฐ์‚ฐ๊ณผ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ
			result |= (1 << (bitString.length() - 1 - i));
		}
	}
	return result;
}

 

XOR ์—ฐ์‚ฐ

์ด์ง„์ˆ˜์˜ ๊ฐ’์˜ ๊ฐ ์ž๋ฆฟ์ˆ˜๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, 1

 public static void main(String []args) {
    int n1 = 4; // 100
    int n2 = 5; // 101

    // XOR ์—ฐ์‚ฐ
    int n3 = n1 ^ n2;   // 001(1)

    // ์ž๋ฆฟ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ, XOR ์—ฐ์‚ฐ
    n1 = 8; // 10000
    int n4 = n1 ^ n2;   // 1000 ^ 101 = 1101(13)

    System.out.println(n3);
    System.out.println(n4);
 }

 

์ด์ง„์ˆ˜ ๊ฐ’์˜ ๊ฐ ์ž๋ฆฟ์ˆ˜ ์ค‘์˜ 1์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ / Brian Kernighan's Algorithm

 

Brian Kernighan's Algorithm์˜ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

n-1์˜ ๊ฐ’์€ n์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— 1๋ถ€ํ„ฐ ๊ฐ’์ด ๋ณ€ํ•œ๋‹ค.

์˜ˆ์‹œ. n = 10100 -> n-1 = 10011

 

์ดํ›„ ๋‘ ๊ฐ’์„ AND์—ฐ์‚ฐ์ž n & (n - 1) ํ•ด์ฃผ๋ฉด, 10000๋˜๋ฉฐ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” 1์ด ์ œ๊ฑฐ๋œ๋‹ค.

์ด ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ’์ด 0์ด ๋œ๋‹ค๋ฉด, ๋ฐ˜๋ณตํ•œ ์—ฐ์‚ฐ์˜ ๊ฐœ์ˆ˜๋Š” n์ด ๊ฐ€์ง€๊ณ ์žˆ๋˜ 1์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™๋‹ค.

public static void main(String []args) {
    int n1 = 4; // 100
    int n2 = 5; // 101
    int n3 = 7; // 111

    System.out.println(BKA(n1));    // 1
    System.out.println(BKA(n2));    // 2
    System.out.println(BKA(n3));    // 3
 }

 // Brian Kernighan's Algorithm
 static int BKA(int n) {
    int cnt = 0;

    while(n > 0) {
        n &= (n - 1);
        cnt++;
    }
    return cnt;
 }
728x90
๋ฐ˜์‘ํ˜•