컴퓨터에서의 수의 표현과 연산
- 컴퓨터에서의 연산은 2진수 표현만으로는 덧셈과 곱셈 연산만 가능하다.
- 컴퓨터는 기본적인 2진수 표현에 대한 보수(Complement) 표현으로 바꿔서 뺄셈과 나눗셈 연산을 수행한다.
보수(Complement)
- 보충해주는 수
- 어떤 수 `a` 에 대한 `n` 의 보수는 `a` 와의 합이 `n` 이 되는 수
- 기수가 `n` 인 어떤 수 `a` 에 대한 `n` 의 보수는 `n` 으로부터 `a` 까지 떨어진 거리라고도 할 수 있다.
- `n` 진수에서의 보수는 `n` 의 보수와 `n - 1` 의 보수가 존재한다.
- 10진수에는 10의 보수와 9의 보수가 존재하고, 5진수에는 5의 보수와 4의 보수가 존재하는 것처럼, 2진수를 사용하는 컴퓨터에서는 2의 보수와 1의 보수가 존재한다.
1의 보수(1's Complement)
어떤 2진수 `a` 와의 합이 `1(1_{2})` 이 되는 수
- 2진수를 구성하는 숫자 `0_{2}` 과 `1_{2}` 에 대한 1의 보수는 다음과 같다.
- `0_{2}` 에 대한 1의 보수 : $0_{2} + x = 1_{2} \quad ∴ x = 1_{2}$
- `1_{2}` 에 대한 1의 보수 : $1_{2} + x = 1_{2} \quad ∴ x = 0_{2}$
- 위 결과를 통해 2진수의 각 자리 숫자를 0은 1로, 1은 0으로 바꾸면 주어진 2진수의 1의 보수가 되는 것을 알 수 있다.
- 예) `53_{10}` 의 2진수는 `110101_{2}` 이고, 이 수에 대한 1의 보수는 각 자리 숫자를 반대로 바꾼 `001010_{2}` 이다.
2의 보수(2's Complement)
어떤 2진수 `a` 와의 합이 `2(10_{2})` 가 되는 수
- 2진수를 구성하는 숫자 `0_{2}` 과 `1_{2}` 에 대한 2의 보수는 다음과 같다.
- `0_{2}` 에 대한 2의 보수 : $0_{2} + x = 0_{2} \quad ∴ x = 0_{2}$
- `1_{2}` 에 대한 2의 보수 : $1_{2} + x = 10_{2} \quad ∴ x = 1_{2}$
- 위 결과를 통해 2의 보수는 1의 보수에 `1_{2}` 을 더한 결과와 같음을 알 수 있다.
- `0_{2}` 에 대한 2의 보수는 `0_{2}` 으로, `0_{2}` 에 대한 1의 보수 `1_{2}` 에 `1_{2}` 을 더한 결과와 같다. ($1_{2} + 1_{2} = 10_{2}$)
- `1_{2}` 에 대한 2의 보수는 `1_{2}` 로, `1_{2}` 에 대한 1의 보수 `0_{2}` 에 `1_{2}` 을 더한 결과와 같다. ($0_{2} + 1_{2} = 1_{2}$)
- 그러므로 주어진 2진수의 2의 보수는 2진수의 1의 보수에 1₂ 을 더한 결과이다.
예제 : 다음 2진수에 대한 1의 보수와 2의 보수를 구하라.
(a) `1101011_{2}`
(b) `100110110_{2}`
(a)
- 1의 보수 : `0010100_{2}`
- 2의 보수 : `0010101_{2}`
(b)
- 1의 보수 : `011001001_{2}`
- 2의 보수 : `011001010_{2}`
컴퓨터에서의 수의 표현
- 컴퓨터는 데이터를 처리할 때 워드(Word) 단위로 처리한다.
- 컴퓨터에서는 정수 데이터를 부호-절댓값, 부호-1의 보수, 부호-2의 보수 형태로 표현한다.
워드(Word)
- 컴퓨터에서 한 번에 처리할 수 있는 1 바이트(Byte) 이상 크기의 데이터 단위
- 워드의 기본 구조는 다음과 같다.
최상위 비트(MSB; Most Significant Bit)
- 워드의 가장 왼쪽에 위치
- 숫자에 대해서는 부호로 표현한다.
- 0 : 양수
- 1 : 음수
- 문자에 대해서는 구분 기준으로 사용된다.
최하위 비트(LSB; Least Significant Bit)
- 워드의 가장 오른쪽에 위치
- 짝수나 홀수에 상관없이 주어진 단위 값이 되는 비트 위치
- 가장 적은 숫자를 오른쪽에 기록하는 자리 표기법의 규정 때문에 가끔 Right-Most Bit 를 뜻하기도 한다.
나머지 비트
- 데이터 값을 표현하는 데 사용된다.
① 부호-절댓값(Sign-Magnitude) 표현
워드의 데이터 비트를 정수 데이터의 절댓값으로 표현하는 방식
- 양수 `+53_{10}` 과 음수 `-53_{10}` 의 절댓값은 `|53_{10}|` 이며, 2진수로는 `110101_{2}` 이다. 이를 이용해 부호-절댓값 표현을 작성하면 다음과 같다.
- 최상위 비트는 부호를 의미하므로 양수 `+53_{10}` 에 대해서는 0, 음수 `-53_{10}` 에 대해서는 1로 표시한다.
- 나머지 7비트의 데이터 비트 영역에는 절댓값 `|53_{10}|` 의 2진수 표현이 될 것이다.
- 그런데 절댓값 `|53_{10}|` 의 2진수인 `110101_{2}` 는 6개의 비트로, 7비트의 데이터 비트를 모두 채우지 못한다. 이때 왼쪽에 남는 비트는 0으로 채운다.
② 부호-1의 보수(Sign-1's Complement) 표현
워드의 데이터 비트를 정수 데이터의 절댓값에 대한 1의 보수로 표현하는 방식
- 부호-1의 보수 표현에서는 워드를 구성하는 비트 중 데이터 비트의 영역이 1의 보수로 채워지고, 부호 비트의 값은 바뀌지 않는다.
- 양수의 경우, 부호-절댓값 표현과 같다.
- 음수의 경우, 부호-절댓값 표현과 다르다.
- 양수 `+53_{10}` 과 음수 `-53_{10}` 에 대한 부호-1의 보수 표현은 다음과 같다.
③ 부호-2의 보수(Sign-2's Complement) 표현
워드의 데이터 비트를 정수 데이터의 절댓값에 대한 2의 보수로 표현하는 방식
- 부호-2의 보수 표현에서는 워드를 구성하는 비트 중 데이터 비트의 영역이 2의 보수로 채워지고, 부호 비트의 값은 바뀌지 않는다.
- 양수의 경우, 부호-절댓값 표현과 같다.
- 음수의 경우, 부호-절댓값 표현과 다르다.
- 양수 `+53_{10}` 과 음수 `-53_{10}` 에 대한 부호-2의 보수 표현은 다음과 같다.
- 양수 `+53_{10}` 과 음수 `-53_{10}` 에 대한 부호-1의 보수 표현과 부호-2의 보수 표현에서 알 수 있듯이, 부호 비트와 양수 `+53_{10}`에 대한 표현은 부호-절댓값 표현과 같다.
예제 : 1워드가 8비트일 때, 주어진 10진수를 부호-절댓값, 부호-1의 보수, 부호-2의 보수로 표현하라.
(a) `+89_{10}`
(b) `-119_{10}`
(a)
`+89_{10}` 의 절댓값은 `|89_{10}| = 1011001_{2}` 이고, 양수이므로 부호 비트는 0이다.
따라서, 부호-절댓값, 부호-1의 보수, 부호-2의 보수 표현 모두 `01011001` 이다.
(b)
`-119_{10}` 의 절댓값은 `|119_{10}| = 1110111_{2}` 이고, 음수이므로 부호 비트는 1이다.
(1) 부호-절댓값 표현 : `11110111`
(2) 부호-1의 보수 표현 : `10001000` ((1)에서 부호 비트를 제외하고 나머지 비트들을 반전시켜준다.)
(3) 부호-2의 보수 표현 : `10001001` (1의 보수 표현(2)의 맨 끝에 1을 더해 준다.)
워드 크기에 따른 데이터의 표현 범위
- 컴퓨터에서 워드 단위로 데이터를 처리하면서 세 가지 방법으로 데이터를 표현할 때, 표현할 수 있는 데이터의 범위가 각각 다르다.
1워드가 `n` 비트인 컴퓨터에서 다음이 성립한다.
(a) 부호-절댓값 표현 범위 : $-(2^{n-1}-1) \; ∼ \; (2^{n-1}-1)$
(b) 부호-1의 보수 표현 범위 : $-(2^{n-1}-1) \; ∼ \; (2^{n-1}-1)$
(c) 부호-2의 보수 표현 범위 : $-2^{n-1} \; ∼ \; 2^{n-1}$
- 예를 들어, 1워드가 8비트일 경우, 표현 범위는 다음과 같다.
- 부호-절댓값 : 10진수 `-127` 부터 `127` 까지 표현 가능
- 부호-1의 보수 : 10진수 `-127` 부터 `127` 까지 표현 가능
- 부호-2의 보수 : 10진수 `-128` 부터 `128` 까지 표현 가능
- 왜 부호-절댓값과 부호-1의 보수가 부호-2의 보수보다 표현 범위가 작을까? 그리고 컴퓨터에서는 어떤 표현 방식으로 연산을 할까? 이 질문에 대한 답을 알아보자. 편의상 1워드를 4비트라고 가정한다.
(1) 연산 결과가 틀리는 부호-절댓값 표현
- 1워드가 4비트인 컴퓨터에서 $-3_{10} - 4_{10} = (-3)_{10} + (-4)_{10}$ 를 연산할 경우, 세 가지 표현 방식에 따른 덧셈 연산 결과는 다음과 같다.
- 위에서 볼 수 있듯이 연산 결과 모두 초과(Overflow)가 발생한다.
- 이때 어떤 표현 방식을 이용하느냐에 따라 초과에 대한 처리 방식이 달라진다.
- 부호-절댓값 표현과 부호-2의 보수 표현을 이용한 연산에서 발생하는 초과는 무시한다.
- 부호-1의 보수 표현을 이용한 연산에서는 1차 연산 결과의 최하위 비트(LSB)에 초과한 비트를 더하여 연산을 완료한다.
- 따라서 부호-절댓값 표현의 연산 결과는 `0111`, 부호-1의 보수 표현의 연산 결과는 `1000`, 부호-2의 보수 표현의 연산 결과는 `1001` 이다.
- 각 연산 결과가 정확한지 확인해보자.
- 우선 부호-1의 보수 표현의 연산 결과인 `1000` 과 부호-2의 보수 표현의 연산 결과인 `1001` 은 10진수로 변환하면 `-7_{10}` 이다.
- 따라서 `-3_{10}-4_{10}` 에 대한 정확한 연산 결과를 확인할 수 있다.
- 그러나 부호-절댓값 표현의 연산 결과인 `0111` 은 10진수로 변환하면 `+7_{10}` 로, `-3_{10}-4_{10} = -7_{10}` 이 아닌 틀린 결과를 얻는다.
- 따라서 부호-절댓값 표현을 이용한 연산은 정확한 결과를 출력하지 못한다는 사실을 알 수 있다.
- 우선 부호-1의 보수 표현의 연산 결과인 `1000` 과 부호-2의 보수 표현의 연산 결과인 `1001` 은 10진수로 변환하면 `-7_{10}` 이다.
초과(Overflow)
- 입력이나 연산의 결과가 1워드를 넘는 경우
- 1워드가 `n` 비트일 때 `n + 1` 비트가 되는 경우
- 이 때, 컴퓨터가 읽는 범위는 `n + 1` 비트 중 하위 1워드이다.
(2) 0에 대한 표현이 2가지인 부호-절댓값 표현, 부호-1의 보수 표현
- `0` 은 양수도, 음수도 아니므로 `+0` 또는 `-0` 이라는 표현은 존재하지 않는다.
- 그런데 `0_{10}` 의 부호-절댓값 표현은 `0000(+0_{10})` 과 `1000(-0_{10})` 으로 2가지이며, 부호-1의 보수 표현 또한 `0000(+0_{10})` 과 `1111(-0_{10})` 로 2가지이다.
- `+0` 과 `-0` 이라는 표현이 존재하지 않음에 위배된다.
- 그러나, 부호-2의 보수 표현에서는 다음과 같이 초과되는 비트를 무시하므로, 10진수 `0_{10}` 은 `0000` 하나로 표현된다.
- (1)과 (2)의 이유로 컴퓨터에서는 부호-2의 보수 표현을 이용하여 연산을 수행한다.
보수의 10진수 변환
- 보수 표현과 부호-절댓값 표현이 동일한 양수의 경우, 2진수를 10진수로 변환하는 방법을 이용하여 10진수로 변환한다.
- 반면, 보수 표현과 부호-절댓값 표현이 다른 음수의 경우 다음 방법을 이용하여 10진수로 변환한다.
부호-1의 보수로 표현한 값의 10진수 변환
- 부호-1의 보수로 표현한 값을 10진수로 변환하는 방법은 다음 2가지가 있다. 두 방법 중 하나를 선택하여 구하면 된다.
① $-(2^{n-1} - 1)$ + (데이터 비트의 10진수 표현)
② 1의 보수 표현의 데이터 비트 부분을 다시 1의 보수로 변환한 후, 이를 10진수로 변환
- 예를 들어, 1워드가 1바이트(=8비트)이면서 부호-1의 보수로 표현된 `11001010` 을 각 방법을 이용해 다음과 같이 10진수로 변환할 수 있다.
- ① $-(2^{8-1} - 1) + (1 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 1 × 2^{1} + 0 × 2^{0})$
$= -127 + (64 + 0 + 0 + 8 + 0 + 2 + 0) = -53$ - ② `11001010` 에 대한 1의 보수 : `10110101` (최상위 비트가 1이므로 음수)
$10110101 = -(0 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
$= -(0 + 32 + 16 + 0 + 4 + 0 + 1) = -53$
- ① $-(2^{8-1} - 1) + (1 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 1 × 2^{1} + 0 × 2^{0})$
예제 : 1워드가 1바이트일 때, 다음과 같이 부호-1의 보수로 표현한 값을 10진수로 변환하라.
(a) `11101001`
(b) `00000111`
(a)
최상위 비트가 1으로 음수이므로, 다음과 같이 2가지 방법을 이용하여 10진수로 변환할 수 있다.
① $-(2^{8-1} - 1) + (1 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0}) = -127 + (64 + 32 + 0 + 8 + 0 + 0 + 1) = -22$
② `11101001` 에 대한 1의 보수 : `10010110` (최상위 비트가 1이므로 음수)
$10010110 = -(0 × 2^{6} + 0 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 0 × 2^{0}) = -(0 + 0 + 16 + 0 + 4 + 2 + 0) = -22$
따라서 `10010110` 을 10진수로 변환하면 `-22` 이다.
(b)
최상위 비트가 0으로 양수이므로 바로 10진수로 변환할 수 있다.
$00000111= -(0 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}) = 0 + 0 + 0 + 0 + 4 + 2 + 1 = 7$
따라서 `00000111` 을 10진수로 변환하면 `7` 이다.
부호-2의 보수로 표현한 값의 10진수 변환
- 부호-2의 보수로 표현한 값을 10진수로 변환하는 방법은 다음 2가지가 있다. 두 방법 중 하나를 선택하여 구하면 된다.
① $-2^{n-1}$ + (데이터 비트의 10진수 표현)
② 2의 보수 표현의 데이터 비트 부분을 다시 2의 보수로 변환한 후, 이를 10진수로 변환
- 예를 들어, 1워드가 1바이트(=8비트)이면서 부호-2의 보수로 표현된 `11001011` 을 각 방법을 이용해 다음과 같이 10진수로 변환할 수 있다.
- ① $-2^{8-1} + (1 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 1 × 2^{1} + 1 × 2^{0})$
$= -128 + (64 + 0 + 0 + 8 + 0 + 2 + 1) = -53$ - ② `11001011` 에 대한 2의 보수 : `10110101` (최상위 비트가 1이므로 음수)
$10110101 = -(0 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
$= -(0 + 32 + 16 + 0 + 4 + 0 + 1) = -53$
- ① $-2^{8-1} + (1 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 1 × 2^{1} + 1 × 2^{0})$
예제 : 1워드가 1바이트일 때, 다음과 같이 부호-2의 보수로 표현한 값을 10진수로 변환하라.
(a) `10001001`
(b) `01110111`
(a)
최상위 비트가 1으로 음수이므로, 다음과 같이 2가지 방법을 이용하여 10진수로 변환할 수 있다.
① $-2^{8-1} + (0 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0}) = -128 + (0 + 0 + 0 + 8 + 0 + 0 + 1) = -119$
② `01110111` 에 대한 2의 보수 : `11110111` (최상위 비트가 1이므로 음수)
$11110111= -(1 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}) = -(64 + 32 + 16 + 0 + 4 + 2 + 1) = -119$
따라서 `11110111` 을 10진수로 변환하면 `-119` 이다.
(2의 보수로 표현된 값에 다시 2의 보수를 취해주면, 원래의 절댓값으로 돌아온다.)
(b)
최상위 비트가 0으로 양수이므로 바로 10진수로 변환할 수 있다.
$01110111= 1 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0} = 64 + 32 + 16 + 0 + 4 + 2 + 1 = 119$
따라서 `01110111` 을 10진수로 변환하면 `119` 이다.
보수의 연산
- 부호-2의 보수는 연산도 정확하고 0에 대한 표현도 한 가지라서 컴퓨터에서는 2의 보수를 이용해 표현하고 연산한다.
- 그리고 부호-1의 보수는 0에 대한 표현이 통일되지 않지만, 연산은 정확하다.
- 그러므로 이 2가지 표현을 이용하여 연산하는 방법을 알아본다.
보수 연산 시 발생하는 초과를 처리하는 방법
- 부호-절댓값 표현 : 발생하는 초과를 무시한다.
- 부호-1의 보수 표현 : 발생한 초과를 1차적으로 구한 결과에 더한다.
- 부호-2의 보수 표현 : 발생하는 초과를 무시한다.
- 각 표현의 연산 결과는 그 표현 방식을 따른다.
- 부호-1의 보수 표현으로 연산하면, 그 결과는 부호-1의 보수 표현이다.
- 부호-2의 보수 표현으로 연산하면, 그 결과는 부호-2의 보수 표현이다.
예 : 1워드가 1바이트일 때, $-15_{10} - 66_{10} = (-15)_{10} + (-66)_{10}$ 을 구해보자.
- `|15_{10}| = 1111` 이고, `|66_{10}| = 1000010` 이며, 부호-절댓값 표현은 각각 `-15_{10} = 10001111`, `-66_{10} = 11000010` 이다.
- 이를 토대로 부호-1의 보수와 부호-2의 보수를 연산하면 다음과 같다.
- 부호-1의 보수 연산의 최종 결과인 `10101110` 은 부호-1의 보수 표현이고, 부호-2의 보수 연산의 최종 결과인 `10101111` 은 부호-2의 보수 표현이다.
- 부호-1의 보수 연산의 결과 `10101110` 을 10진수로 변환하면 다음과 같다.
- ① $-(2^{8-1} - 1) + (0 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 0 × 2^{0})$
$= -127 + (0 + 32 + 0 + 8 + 4 + 2 + 0) = -81$ - ② `10101110` 에 대한 1의 보수 : `11010001`
$11010001 = -(1 × 2^{6} + 0 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
$= -(64 + 0 + 16 + 0 + 0 + 0 + 1) = -81$
- ① $-(2^{8-1} - 1) + (0 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 0 × 2^{0})$
- 부호-2의 보수 연산의 결과 `10101111` 을 10진수로 변환하면 다음과 같다.
- ① $-2^{8-1} + (0 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}) $
$= -128 + (0 + 32 + 0 + 8 + 4 + 2 + 1) = -81$ - ② `10101111` 에 대한 2의 보수 : `11010001`
- $11010001= -(1 × 2^{6} + 0 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
$= -(64 + 0 + 16 + 0 + 0 + 0 + 1) = -81$
- $11010001= -(1 × 2^{6} + 0 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
- ① $-2^{8-1} + (0 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}) $
- 부호-1의 보수 연산의 결과 `10101110` 을 10진수로 변환하면 다음과 같다.
예제 1 : 1워드가 1바이트 일 때, 부호-1의 보수를 이용하여 다음을 연산하라.
(a) $100_{10} + 13_{10}$
(b) $100_{10} - 13_{10}$
(c) $-100_{10} + 13_{10}$
(d) $-100_{10} - 13_{10}$
pf)
$100_{10} = 1100100, \; |13_{10}| = 1101$ 이고, 각 수에 대한 부호-절댓값 표현과 부호-1의 보수 표현은 다음과 같다.
(a) | (b) |
(c) | (d) |
예제 2 : 1워드가 1바이트 일 때, 부호-2의 보수를 이용하여 다음을 연산하라.
(a) $100_{10} + 13_{10}$
(b) $100_{10} - 13_{10}$
(c) $-100_{10} + 13_{10}$
(d) $-100_{10} - 13_{10}$
pf)
$100_{10} = 1100100, \; |13_{10}| = 1101$ 이고, 각 수에 대한 부호-절댓값 표현과 부호-2의 보수 표현은 다음과 같다.
(a) | (b) |
(c) | (d) |
'Mathematics > 이산 수학' 카테고리의 다른 글
[이산 수학] 합성 명제 (0) | 2022.10.02 |
---|---|
[이산 수학] 조건 명제 (0) | 2022.10.02 |
[이산 수학] 논리 연산자 (0) | 2022.10.02 |
[이산 수학] 명제 (0) | 2022.10.02 |
[이산 수학] 진법별 사칙연산 (0) | 2022.09.26 |
[이산 수학] 진법 간 변환 (0) | 2022.09.20 |
[이산 수학] 진법별 표현 (0) | 2022.09.20 |
[이산 수학] 수의 연산 (0) | 2022.09.19 |