[Java] μλ°μ μ΄μ§ μ°μ°(λΉνΈ μ°μ°)
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;
}