기초 야: 부호 없 는 정수

5264 단어 컴퓨터 기반
Brief                              
  JS 에서 0.1 + 0.2 = 0.300000000000000000004 의 원인 만 이해 하려 고 했 지만 컴퓨터 의 숫자 표시 와 연산 이 매우 낯 설 다 는 것 을 알 고 악 보 를 할 수 밖 에 없 었 다.『 8195 』 본 편 은 기초 적 인 기초 인 부호 없 는 정수 의 표현 방식 과 가감 곱 하기 연산 을 연구 합 시다.
Encode                              
『 8195 』 기호 가 없 는 정 수 는 0 보다 크 거나 같은 정수 만 표시 할 수 있다.그 바 이 너 리 인 코딩 방식 은 매우 직관 적 이 고 진가 역 만 포함한다.  우 리 는 8bit 의 저장 공간 을 예 로 들 면 진가 역 은 8bit 를 차지 하기 때문에 표시 할 수 있 는 수치 범 위 는 {0,..., 255} 이 고 대응 하 는 이 진 인 코딩 은 {0000000,..., 11111111111} 이다.  집합 론의 측면 에서 묘사 하면 우 리 는 십 진법 이 표시 하 는 수치 범 위 를 집합 A 로 정의 하고 이 진법 이 표시 하 는 수치 범 위 를 집합 B 로 정의 할 수 있 으 며 그들 사이 의 매 핑 은 f 로 정의 할 수 있다.f (a) = b, 그 중에서 a 는 A, b 는 B 에 속한다.그리고 f 는 쌍 사 함수 입 니 다.따라서 부호 가 없 는 정수 표시 방식 은 다음 과 같은 특징 을 가진다.
  • 표시 할 수 있 는 수치 범위 가 작다.
  • 10 진법 이 나타 내 는 수치 범위 와 2 진법 이 나타 내 는 수치 범위 의 요 소 는 일일이 대응 하고 이들 은 정확하게 매 핑 하여 전환 할 수 있다.(부동 소수점 에 비해 일부 이 진 이 표시 하 는 수 치 는 10 진법 이 표시 하 는 수치의 근사 값 으로 만 비 출 수 있다)
  • Zero-extend                          
    『 8195 』 0 확장 연산 은 수치 가 변 하지 않 는 전제 에서 서로 다른 글자 의 정수 간 의 전환 에 사용 된다.예 를 들 어 지금 우 리 는 8bit 의 00000000 을 16bit 로 확장 하려 고 한다. 그러면 우 리 는 높 은 8bit 를 0 으로 설정 하면 0000000000000 000 100 을 얻 을 수 있 고 그 수 치 는 변화 가 없 을 것 이다.
    Truncation                           
    『 8195 』 절단 은 자릿수 를 줄 이 고 원시 값 을 모델 링 합 니 다.모드 는 2 ^ n 이 고 n 은 절 단 된 자릿수 입 니 다.  예 를 들 어 현재 16bit 의 00000000000000000000000 100 을 8bit 로 자 르 면 결 과 는 00000100 이 고 모델 은 2 ^ 8 입 니 다.
    Addition                            
    * 8195 주의: 비트 급 연산 은 모두 모드 연산 입 니 다. 즉, 가감 곱 하기 후 모두 연산 결과 에 대해 모드 를 취하 고 모드 를 취한 후의 결 과 를 중지 합 니 다.『 8195 』 부호 없 는 정수 덧셈 의 연산 순서:
  • 산술 덧셈;
  • 절단 작업 을 수행 합 니 다.

  • 예 를 들 어 두 4bit 의 부호 없 는 숫자 를 더 합 니 다 (11 + 6).
    1011
    +0110
    10001,        0001

    Subtraction                          
    『 8195 』 부호 없 는 정수 감법 의 연산 순서:
  • 감법 을 덧셈 으로 전환한다.
  • 산술 덧셈;
  • 절단 작업 을 수행 합 니 다.

  • 예 를 들 어 두 4bit 의 부호 없 는 숫자 가 서로 줄어든다 (11 - 6).
     1011
    -0110

    『 8195 』 감수 에 대해 보충 코드 를 구 한 후, 감법 은 덧셈 으로 바 뀌 었 다.
     1011
    +1010
     10101,        0101

    Multiplication                        
      곱셈 에 대해 실질 적 으로 이 위 조작 과 가, 감법 조합 을 통 해 이 루어 지고 곱셈 이 2 인지 n 차 멱 에 따라 구별 처리한다.
  • 곱셈 이 2 인 n 차 멱 의 경우 곱셈 공식 은 a < 4 등가 가 6 (2 ^ 2) 이면 이 위 조작 6 < < 2 로 전환 하면 된다.그리고 결 과 를 본 떠 서
  • 곱셈 이 2 가 아 닌 n 차 멱 의 경우 2.1. 곱셈 을 2 진법 으로 표시 하고 연속 적 인 1 로 조 를 나눈다.예 를 들 어 43 의 이 진 형식 은 00 (1) 0 (1) 0 (11) 이 고 왼쪽 에서 오른쪽으로 3 조로 나 눌 수 있다. 각각 (1), (1) 과 (11) 이다.

  • 2.2. n 으로 각 조 의 가장 높 은 지 수 를 나타 내 고 m 로 각 조 의 가장 낮은 지 수 를 나타 낸다.예 를 들 어 1 조 n = m = 5, 2 조 n = m = 3, 3 조 n = 1 과 m = 0.2.3. 공식 (x <
               :2<

    2.4. 결과 에 대해 모델 링 을 한다.
    Dividision                           
      나눗셈 에 대해 실질 적 으로 이 위 조작 과 더하기, 뺄셈 을 조합 하여 만 든 것 이 고 나눗셈 이 2 인지 n 차 멱 에 따라 구별 처리 하 는 것 이다.
  • 피 제수 가 2 인 n 차 멱 의 경우 나 누 기 공식 은 a > > n 이 며, 예 를 들 어 6 / 4 등가 가 6 / (2 ^ 2) 이면 이 위 조작 6 > > 2 로 전환 할 수 있다. 그리고 결 과 를 모델 링 한다.
  • 피 제수 가 2 가 아 닌 n 차 멱 의 경우 상황 이 매우 복잡 하 다. 연산 절 차 는 다음 과 같다. (실질 적 으로 우 리 는 이 절차 에 따라 10 진법 으로 나 누 는 것 이다)2.1. 고위 정렬 은 제 거 된 수치 보다 수치 가 적은 전제 에서 제 거 된 자릿수 를 제 거 된 숫자 와 같 게 합 니 다. 만약 에 고위 정렬 을 실행 한 후에 제 거 된 수치 가 제 거 된 수치 보다 크 면 제 수 는 오른쪽으로 한 자리 이동 합 니 다. 변위 수 를 얻 을 수 있 습 니 다.
  • 2.2. 테스트, 나 누 기 - 나 누 기 N = 나머지 중간 값, 그 중에서 N 나 누 기 < = 나 누 기 & & (N + 1)나 누 기 > 나 누 기. 상 = 상 + N 기수 ^ 변위 수. 2.3. 위 절 차 를 반복 적 으로 실행 합 니 다. 더 이상 고위 정렬 이 필요 없 을 때 까지 2.2 에서 얻 은 나머지 중간 값 은 나 누 기 연산 의 최종 나머지 로 합 니 다. 그렇지 않 으 면 나머지 중간 값 은 다음 라운드 고위 정렬 의 나 누 기 로 처 리 됩 니 다.
      다음은 C 의 실현 이다.
    
    #include 
    
    //     
    const unsigned short lowest_bit_weight = 1; //           
    
    int main(){
      //   
      unsigned short dividend = 14, divisor = 5;
     
      //   
      unsigned short quotients = 0,  //  
                     rem = 0;        //   
    
      //    
      unsigned short highest_bit_weight,
             divisor_aligned,
             tmp_dividend = dividend;
      unsigned short high_alignment;
    
      //     
      while (1){
          //      (       )
          //   :1.                  ;
          //       2.                  ,         ;
          high_alignment = 0;
          highest_bit_weight = lowest_bit_weight;
          divisor_aligned = divisor;
          while (tmp_dividend >= divisor_aligned){
            divisor_aligned = divisor_aligned << 1;
            highest_bit_weight = highest_bit_weight << 1;
    
            high_alignment += 1;
          }
          if (high_alignment > 0){
            divisor_aligned = divisor_aligned >> 1;
            highest_bit_weight = highest_bit_weight >> 1;
            high_alignment -= 1;
          }
    
          //           ,             ,      
          if (0 == high_alignment) {
            rem = tmp_dividend;
            break;
          }
    
          //                        
          quotients = quotients | highest_bit_weight;
          //                  
          tmp_dividend = tmp_dividend - divisor_aligned;
      }
      printf("%u/%u=%u(rem:%u)
    ", dividend, divisor, quotients, rem); return 0; }

    Conclusion                          
    『 8195 』 오리지널 을 존중 하고 전재 할 때 다음 과 같이 명시 해 주 십시오.http://www.cnblogs.com/fsjohnhuang/p/5078290.html 뚱뚱보 존 ^ ^
    Thanks                            
    《 컴퓨터 시스템 을 깊이 이해 하 다 》.

    좋은 웹페이지 즐겨찾기