알고리즘 (원 코드, 리 코딩, 패 치)
0000 0001 = +000 0001 = +1,1000 0001 = –000 0001 = –1
양수 의 반 코드 와 패 치 는 그 자체 (원 코드)
[+1]
= [00000001]
= [00000001]
= [00000001]
음수 의 반 코드 는 그 원 코드 를 바탕 으로 부호 의 위치 가 변 하지 않 고 나머지 각 비트 는 반 을 취한 다. [-1]
= [10000001]
= [11111110]
음수 의 보충 코드 는 그 원 코드 를 바탕 으로 부호 의 위치 가 변 하지 않 고 나머지 는 여러분 이 반대로 하 는 것 입 니 다. 마지막 으로 + 1. (즉, 반 코드 를 바탕 으로 + 1) [-1]
= [10000001]
= [11111110]
= [11111111]
왜 리 코딩 과 패 치 를 사용 합 니까?컴퓨터 의 기초 회로 설 계 를 매우 복잡 하 게 만 들 지 않도록 기 계 는 덧셈 만 있 고 뺄셈 은 없 을 수 있다. 연산 법칙 에 따라 하나의 정 수 를 빼 는 것 은 마이너스 하 나 를 더 하 는 것 과 같다. 즉, 1 - 1 = 1 + (- 1) = 0 이다.
원 코드 감법 문 제 를 해결 하기 위해 반 코드 가 나 왔 다.
1 - 1
= 1 + (-1)
= [00000001]
+ [10000001]
= [10000010]
(분명히 잘못된 것 이다!)리 코딩 사용:
-2
= 1 - 1
= 1 + (-1)
+ [0000 0001]
= [1000 0001]
+ [0000 0001]
= [1111 1110]
= [1111 1111]
그러나 [1000 0000]
와 -0
두 개의 인 코딩 (즉 + 0 과 - 0) 표시 [0000 0000]
를 초래 할 수 있다.패 치 의 출현 은 바로 + 를 해결 하기 위 한 것 이다. - 0 의 문제
[1000 0000]
= 0
+ 1-1
= 1 + (-1)
+ [0000 0001]
= [1000 0001]
= [0000 0001]
이렇게 0 용 [1111 1111]
으로 표시 하고 [0000 0000]
는 - 128: [0000 0000]
= [0000 0000]
+ [1000 0000]
= (-1) + (-127)
+ [1000 0001]
= [1111 1111]
[1111 1111]
실제 적 으로 예전 의 - 0 의 패 치 를 사용 하여 - 128 을 표시 하기 때문에 - 128 은 원 코드 와 반전 표시 가 없다. (- 128 의 패 치 표시 [1000 0001]
계산 한 원 코드 는 [1000 0000]
이 고 이것 은 부정 확 하 다) [1000 0000]
= [1000 0000]
= [0000 0000]
= [1000 0000]
[0111 1111]
= [0000 0000]
= 0
따라서 8 비트 2 진법, 원 코드 또는 반 코드 로 표시 하 는 범 위 는 [- 127, + 127] 이 고, 패 치 로 표시 하 는 범 위 는 [-
[1000 0000]
, [1111 1111]
- 1] [- 128, 127] 이다. 기계 가 패 치 를 사용 하기 때문에 프로 그래 밍 에서 자주 사용 하 는 32 비트 int 유형 에 대해 범 위 는 [- [1000 0000]
, 2^8
- 1] 이 라 고 할 수 있다.원리
시계 리 턴 은 시 계 를 1 자리 12 진수 라 고 생각 합 니 다. 현재 8 시 라면 6 시 로 설정 하 십시오.
2^8
(y! = 0)2^32
= 2^31
= x mod y = x - y [x / y]
= -3 mod 2
= -3 - 2 X [-3 / 2]
= -3 - 2 X [-1.5]
위로 돌아 가 는 문제, - 2 와 10 은 동 여 입 니 다.
(-2) mod 12 = 10
10 mod 12 = 10
음 수 를 양수 로 대체 하려 면 같은 나머지 두 가지 정 리 를 활용 해 야 한다.
반신 성:
-3 - 2 X (-2)
(같은 나머지)선형 연산 정리: (증명)
만약
-3 + 4
, 1
그렇다면: (1) a ≡ a (mod m)
(2) a ≡ b (mod m)
그래서: 7 ≡ 7 (mod 12)
(-2) ≡ 10 (mod 12)
7 -2 ≡ 7 + 10 (mod 12)
다음은 바 이 너 리 문제 로 돌아 가 보 겠 습 니 다. 2 - 1 = 1 의 문제 입 니 다.
c ≡ d (mod m)
= a ± c ≡ b ± d (mod m)
= a * c ≡ b * d (mod m)
+ 2-1
= 2+(-1)
먼저 이 단계 에 이 르 러 - 1 의 반 코드 는 [0000 0010]
임 을 나타 낸다. 만약 에 여기 서 [1000 0001]
를 원 코드 로 본다 면 [0000 0010]
= - 126, 여기 서 기호 위 치 를 제외 하면 126 이 라 고 생각한다.다음 과 같은 규칙 이 발견 되 었 습 니 다.
(-1) mod 127 = 126
126 mod 127 = 126
:
(-1) ≡ 126 (mod 127)
2-1 ≡ 2+126 (mod 127)
2 - 1 과 2 + 126 의 나머지 결 과 는 같 습 니 다!그리고 이 나머지 는 본 격 적 으로 우리 가 기대 하 는 계산 결과: 2 - 1 = 1
그래서 한 수의 반 코드 는 실제 적 으로 이 숫자 가 한 모델 에 대한 동 나머지 입 니 다. 이 모델 은 우리 의 바 이 너 리 가 아니 라 표시 할 수 있 는 최대 치 입 니 다!이것 은 시계 와 마찬가지 로 한 바퀴 돌 면 표시 가능 한 범위 내 에서 정확 한 수 치 를 찾 을 수 있 습 니 다!
그리고 2 + 126 은 시계 가 한 바퀴 돌 았 던 것 과 비슷 하 다. 기호 위 치 는 계산 에 참여 하고 넘 치 는 최고 위치 와 정확 한 연산 결 과 를 형성 하기 때문이다.
왜 반 코드 에 1 을 더 하면 정확 한 결 과 를 얻 을 수 있 습 니까?
[1111 1110]
= [0000 0000]
= [1111 1110]
+ [1111 1110]
= [1111 1110]
+ 2-1
2+(-1)
을 원 코드 로 하고 기호 위 치 를 제거 하면: [0000 0010]
반 코드 를 바탕 으로 + 1 은 막 의 값 을 증가 하 는 것 과 같 습 니 다.(-1) mod 128 = 127
127 mod 128 = 127
2-1 ≡ 2+127 (mod 128)
이때, 시계 판 은 128 개의 눈금 마다 한 바퀴 돌 고 있 는 것 과 같 습 니 다. 따라서 패 치 로 표 시 된 연산 결과 의 최소 값 과 최대 값 은 [- 128, 128] 이 어야 합 니 다.
그러나 0 의 특수 한 상황 으로 128 을 표시 할 방법 이 없 기 때문에 보충 코드 의 수치 범 위 는 [- 128, 127] 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.