JAVA

1.  비트열 반전 연산자 (~)

 


public class Test021
{
	public static void main(String[] args)
	{
		int a = 10, b = -10;
		
		System.out.printf("~a : %d\n", ~a);
		System.out.printf("~b : %d\n", ~b);
	}
}

// 실행 결과
/*
~a : -11
~b : 9                              
계속하려면 아무 키나 누르십시오 . . .  
*/

 

 


2. AND, OR, XOR 연산자 (&, |, ^)

 

public class Test022
{
	public static void main(String[] args)
	{
		int a = 13, b = 7;
		int c, d, e;

		c = a & b;	// 비트 AND
		d = a | b;	// 비트 OR
		e = a ^ b;	// 비트 XOR

		System.out.printf("a & b : %d\n",c);
		System.out.printf("a | b : %d\n",d);
		System.out.printf("a ^ b : %d\n",e);
	}
}

// 실행 결과

/*
a & b : 5
a | b : 15
a ^ b : 10
계속하려면 아무 키나 누르십시오 . . .
*/

 

 


3. 시프트 연산(<<, >>, <<<, >>>)

 

왼쪽 시프트연산을 한번 수행하면 2배가 되고 오른쪽으로 시프트연산을 한번 수행하면 1/2배가 된다.

 

public class Test024
{
	public static void main(String[] args)
	{
							//							  |
		int x = 128;		// 00000000 00000000 00000000 10000000
		 
		System.out.printf("x << 3 : %d\n", x << 3);	// 00000000 00000000 00000100 00000000
		System.out.printf("x * 8  : %d\n", x * 8);		
												 //                                  |
		System.out.printf("x >> 3 : %d\n", x >> 3); // 00000000 00000000 00000000 00010000
		System.out.printf("x / 8  : %d\n", x / 8);
		System.out.printf("x << 24 : %d\n", x << 24);
		//--==>> x << 24 : -2147483648
		// |
		// 10000000 00000000 00000000 00000000

	}
}

4. 두 수의 교환

 

일반적인 두 변수의 자리 바꿈은 temp와 같은 임시저장을 위한 변수를 만들어 이를 이용해 두 변수를 교환한다.

 


public class Test023
{
	public static void main(String[] args)
	{
		// ○ 일반적인 두 변수(a, b)의 자리 바꿈
		
		int a=10, b=20; //-- 내용물을 바꾸기 위한 두 정수
		int temp; //-- 임시 저장 변수

		
		// 내용물을 바꾸기 전 확인
		System.out.println("a : " + a + ", b : " + b);
	

		// 연산 및 처리(내용물 바꾸기 → 기본 대입 연산 활용)
		temp = a;
		a = b;
		b = temp;
		
		// 연산 처리 후 결과 확인
		System.out.println("a : " + a + ", b : " + b);
	}
}

 

이를 xor연산을 다음과 같이 수행하면 아래와 같이 간단하게 해결할 수 있다.

 


public class Test023
{
	public static void main(String[] args)
	{
		// ○ 비트 단위 연산자 "XOR" 연산자를 활용하여
		//	  두 변수에 담겨있는 내용(값) 바꾸기

		// 주요 변수 선언 및 초기화
		int x = 20, y = 23;

		// 각 변수에 담긴 내용물 확인
		System.out.printf("x : %d, y : %d\n", x, y);

		// 연산 및 처리
		/*
		x = x ^ y;
		y = y ^ x;
		x = x ^ y;
		*/

		y = y ^ x;
		x = x ^ y;
		y = y ^ x;

		// 연산 처리 후 결과 확인
		System.out.printf("x : %d, y : %d\n",x, y);
	}
}
// 실행 결과
/*
x : 20, y : 23
x : 23, y : 20
*/


 

 

■■■음의정수표현■■■

①. -10을 byte 기반 비트열로 나타낸다.

ㄱ. 0 0001010 → 10을 byte기반으로 나타냄
ㄴ. 1 1110101 → 1의 보수를 취한다
ㄷ. 1 1110101 + 00000001 → 2의 보수를 취한다

   1 1110101
   0 0000001 +
--------------
   11110110 

ㄹ. byte 기반으로 나타낸 10과 -10을 합하여 합이 0이 맞는지 확인

    1 1110110
    0 0001010 +
---------------
  1 0 0000000 


※ 11110110

②. -27을 byte 기반 비트열로 나타낸다.

ㄱ. 0 0011011 → 27을 byte기반으로 나타냄
ㄴ. 1 1100100 → 1의 보수를 취한다
ㄷ. 1 1100100 + 0 0000001 → 2의 보수를 취한다
    
    1 1100100
    0 0000001 +
-----------------
    1 1100101

ㄹ. byte 기반으로 나타낸 27과 -27을 합하여 합이 0이 맞는지 확인
   
    0 0011011
    1 1100101  +
  -----------------
  1 0 0000000

※ 1 1100101

③. -31을 byte 기반 비트열로 나타낸다.

ㄱ. 0 0011111
ㄴ. 1 1100000
ㄷ. 1 1100001

※ 1 1100001

④. -13을 byte 기반 비트열로 나타낸다.

ㄱ. 0 0001101
ㄴ. 1 1110010
ㄷ. 1 1110011

※ 1 1110011

⑤. byte 기반의 11001010을 10진수 정수형으로 나타낸다.

ㄱ. 2의 보수가 취해진 11001010에서 1을 뺀다.
    1 1001010
    0 0000001 -
-------------------
    1 1001001

ㄴ. 1의 보수를 취한다.
    0 0110110

ㄷ. 10진수로 변환후 -부호를 붙인다.
※ -54


⑥. byte 기반의 11110101을 10진수 정수형으로 나타낸다.

ㄱ.1 1110101 - 0 0000001 = 1 1110100
ㄴ.0 0001011
ㄷ. -11
※ -11

⑦. byte 기반의 10000001을 10진수 정수형으로 나타낸다.

ㄱ.1 0000001 - 0 0000001 = 1 0000000
ㄴ.0 1111111
ㄷ.-127
※ -127

⑧. byte 기반의 10101010을 10진수 정수형으로 나타낸다.

ㄱ. 1 0101010 - 0 0000001 = 1 0101001
ㄴ. 0 1010110
ㄷ. -86
※ -86

⑨. byte 기반의 10000101을 10진수 정수형으로 나타낸다.

ㄱ. 1 0000101 - 0 0000001 = 1 0000100
ㄴ. 0 1111011
ㄷ. -123
※ -123

⑩.byte 기반의 11111111을 10진수 정수형으로 나타낸다.

ㄱ. 1 1111111 - 0 0000001 = 1 1111110
ㄴ. 0 0000001
ㄷ. -1
※ -1

 

※ 사용자로부터 임의의 정수를 두 번 입력받아 사칙연산 및 나머지 연산을 수행하여 그 결과를 출력하는 프로그램을 구현한다. 단, 입력받는 과정은 BufferedReader 를 활용할 수 있도록 하고 출력하는 과정은 printf() 메소드를 활용할 수 있도록 한다. 또한, 나눗셈 연산은 편의상 정수 기반으로 처리한다.


 실행 예)
 첫 번째 정수 입력 : 10
 두 번째 정수 입력 : 2

 =====[결과]=====
 10 + 2 = 12
 10 - 2 = 8
 10 * 2 = 20
 10 / 2 = 5
 10 % 2 = 0
 ================



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test020
{
	public static void main(String[] args) throws IOException
	{
		// 주요 변수 선언
		int num1, num2;						//-- 사용자 입력값을 담을 변수
		int res1, res2, res3, res4, res5;	//-- 연산 결과를 담을 변수
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		
		// 연사 및 처리
		// ① 사용자에게 안내 메세지 출력
		System.out.print("첫 번째 정수 입력 : ");

		// ② 사용자가 입력한 값(문자열)을 정수형태로 변환한 후 변수 num1 에 담아내기
		num1 = Integer.parseInt(br.readLine());

		// ③ 사용자에게 안내 메세지 출력
		System.out.print("두 번째 정수 입력 : ");

		// ④ 사용자가 입력한 값(문자열)을 정수형태로 변환한 후 변수 num2 에 담아내기
		num2 = Integer.parseInt(br.readLine());

		// ⑤ 산술 연산 수행
		res1 = num1 + num2;
		res2 = num1 - num2;
		res3 = num1 * num2;
		res4 = num1 / num2;
		res5 = num1 % num2;

		
		// 결과 출력
		System.out.printf("=====[결과]=====\n");

		System.out.printf("%d + %d = %d\n", num1, num2, res1);
		System.out.printf("%d - %d = %d\n", num1, num2, res2);
		System.out.printf("%d * %d = %d\n", num1, num2, res3);
		System.out.printf("%d / %d = %d\n", num1, num2, res4);
		System.out.printf("%d %% %d = %d\n", num1, num2, res5);
		
		System.out.printf("================\n");


/*
		// BufferedReader 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 주요 변수 선언
		int num1, num2;

		// 연산 및 처리
		System.out.print("첫 번째 정수 입력 : ");
		num1 = Integer.parseInt(br.readLine());

		System.out.print("두 번째 정수 입력 : ");
		num2 = Integer.parseInt(br.readLine());

		// 결과 출력
		System.out.println("=====[결과]=====");
		System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));
		System.out.println(num1 + " - " + num2 + " = " + (num1 - num2));
		System.out.println(num1 + " * " + num2 + " = " + (num1 * num2));
		System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
		System.out.println(num1 + " % " + num2 + " = " + (num1 % num2));
		System.out.println("================");
*/

	}
}

// 실행 결과

/*
첫 번째 정수 입력 : 10
두 번째 정수 입력 : 2
=====[결과]=====
10 + 2 = 12
10 - 2 = 8
10 * 2 = 20
10 / 2 = 5
10 % 2 = 0
================
계속하려면 아무 키나 누르십시오 . . .
*/

※ 아래는 float(4 Byte) 보다 double(8 Byte)가 더 정밀하다는 것을 보여준다


public class Test019
{
	public static void main(String[] args)
	{
		// 주요 변수 선언
		float a = 0;
		double b = 0;

		

		// 연산 및 처리 → 반복 연산 → 100000(십만)번 반복
		for(int i = 1; i<=100000; i++)
		{
			a += 100000;	// 변수 a 를 100000 만큼 증가시켜라
			b += 100000;	// 변수 b 를 100000 만큼 증가시켜라
		}

		// 결과 출력
		System.out.println("float a : " + (a/100000));
		System.out.println("double b : " + (b/100000));
	
	}
}

// 실행 결과

/*
float a : 99996.055
double b : 100000.0
계속하려면 아무 키나 누르십시오 . . .
*/

※ Scanner클래스의 메소드인 useDelimiter를 이용하여 콤마(,) 문자를 기준으로 next메소드를 사용하여 입력받을 수 있다. 이를 활용하여 학생의 이름과 성적을 입력받는 프로그램을 구현하여라.

 



import java.util.Scanner;

public class Test018
{
	public static void main(String[] args)
	{
		// Scnanner 인스턴스 생성
		Scanner sc = new Scanner(System.in);

		// 주요 변수 선언
		String name;
		int kor, eng, mat, tot;	

		// 연산 및 처리
		System.out.print("이름,국어,영어,수학 입력(',' 구분) : ");
		sc = new Scanner(sc.next()).useDelimiter("\\s*,\\s*");
		//				-----------
		//				조윤상,90,80,70
		
		name = sc.next();		//김승범
		kor = sc.nextInt();		// 90
		eng = sc.nextInt();		// 80
		mat = sc.nextInt();		// 70
		
		tot = kor + eng + mat;

		// 결과 처리
		System.out.println();
		System.out.println(">> 이름 : " + name);
		System.out.println(">> 총점 : " + tot);


	}
}

import java.util.Scanner;

public class Test017
{
	public static void main(String[] args)
	{
		// Scanner 인스턴스 생성
		Scanner sc = new Scanner(System.in);

		// 주요 변수 선언
		String name;				//-- 이름
		int kor, eng, mat, tot;		//-- 국어, 영어, 수학, 총점

		
		// 연산 및 처리
		// ① 사용자에게 안내 메세지 출력
		System.out.print("이름 국어 영어 수학 점수입력(공백구분) : ");
		// 조윤상 90 80 70
		
		// ② 사용자가 입력한 데이터를 각 변수에 담아내기
		name = sc.next();
		kor = sc.nextInt();
		eng = sc.nextInt();
		mat = sc.nextInt();
		
		// ③ 총점 산출
		tot = kor + eng + mat;
		

		// 결과 출력
		System.out.println();
		System.out.println(">> 이름 : " + name);
		System.out.println(">> 총점 : " + tot);


	}
}

//실행 결과
/*
이름 국어 영어 수학 점수입력(공백구분) : 조윤상 90 80 70

>> 이름 : 조윤상
>> 총점 : 240
계속하려면 아무 키나 누르십시오 . . .
*/

+ Recent posts