2016-12-12 1 views
1

전체 36 바이트 데이터의 유형 변환 배열 uint8_t이 있습니다. 전체 배열을 통해 비트을 순환하여 시프트하고 싶습니다 (오른쪽 시프트). 어떻게해야합니까? 예 :배열의 비트 순환 시프트

uint8_t arr[3] = {0x03, 0x44, 0x32} 

한 시프트 후에는 같아야

arr[3] = {0x01, 0xa2, 0x19} 
+1

비 원형 이동을 수행하는 방법을 알고 있습니까? 그리고 순환 시프트의 결과로 인해 여분의 바이트가 필요한 이유는 무엇입니까? –

+0

오른쪽으로 회전이라고도하는 순환 시프트 오른쪽은 시퀀스의 최하위 비트가 최상위 비트로 순환된다는 것을 의미합니다. 0x03 회전 된 단일 바이트 예제를 사용하면 0x81이됩니다. 오른쪽으로 이동 한 값이 0x01 인 경우. 여기에 어느 것을 염두에두고 있습니까? –

+0

@ PeterCamilleri - OP가 전체 배열의 비트를 회전 시키려고하고 있다고 생각합니다. 따라서 요소 'n'의 최하위 비트는 요소 'n + 1'의 최상위 비트가됩니다. 마지막 요소의 최하위 비트가 첫 번째 요소의 최상위 비트가됩니다. – Paolo

답변

0

다음 코드로 배열을 순환 시프트 할 수 있습니다. 거의 자명하지 못하다. 당신이 값을 마우스 오른쪽 시프트로 가장 낮은 비트를 잃게

int main() 
{ 
    uint8_t arr[3] = {0x03, 0x44, 0x32}; 


    int i, 
     l; 


    uint8_t savedCarry, 
      carry; 


    // let `l` be the size (nr. of elements) of the array 

    l = 3; 


    // this will cause the array bit shift to be circular 
    // by taking the "carry" bit (lowest bit) from the last element of the array 
    // this "carry" bit will be used on the first element in the `for` loop 

    carry = arr[ l - 1 ] & 1; 


    // loop trought the array applying bit shift 

    for(i = 0; i < 3; i++) 
    { 
     savedCarry = arr[i] & 1;  // save the lowest bit 
     arr[i] = arr[i] >> 1;   // right shift 
     if(carry) 
     { 
      arr[i] |= (uint8_t) 0x80; // the lowest bit of the previuos element becomes the highest bit of the current one 
     } 
     carry = savedCarry;    // the lowest bit of this element will become the highest of the next one 
    } 


    // display hex output 

    for(i = 0; i < 3; i++) 
    { 
     printf("0x%02x\n", arr[i]); 
    } 

    return(0); 
} 

윌 출력

0x01 
0xa2 
0x19 

참고. 이것이 작동하기 전에 가장 낮은 비트가 savedCarry에 저장되는 이유입니다.

for 반복 전에 savedCarrycarry에 복사되어 다음 배열 값 (다음 반복시)에서 가장 높은 비트를 설정합니다.

1

루프 배열의 각 바이트를 통하여. 각 바이트에 대해 먼저 낮은 비트를 확인하고 설정되어 있으면 캐리 아웃 플래그를 설정하십시오. 그런 다음 바이트를 하나씩 이동할 수 있습니다.

다음 바이트에 대해 위 내용을 반복하되 먼저 carry-in 플래그를 carry-out 플래그의 현재 값으로 설정하십시오. 이동 후에는 캐리 인 플래그를 확인하고 설정되어 있으면 현재 바이트의 상위 비트를 설정합니다. 어레이의 끝 부분을 칠 때까지 계속하십시오. 캐리 아웃 플래그가 마지막에 설정되면 첫 번째 바이트의 상위 비트를 설정합니다.

+0

C를 사용하여 캐리 비트를 작성하는 방법을 설명해야 할 수도 있습니다. 실제로 캐리 비트가 있다고 가정 할 수 있습니까? –

+0

@ScottHunter "캐리 플래그"여야합니다. 편집 됨. – dbush

+1

캐리 플래그를 마지막 요소의 하위 비트로 초기화하면 끝으로 돌아갈 필요가 없습니다. – Persixty

1

가정 배열 인덱스이 될 것이라고 할 0에서 N - 1, 한 방향으로 이동 :

  • 저장 마지막 요소의 마지막 비트를. 이것은 원 제 요소에 반송로 추가 할 것이다 1-N - 1 각 요소 i 들어

    uint8_t circular_carry = (arr[N - 1] & 1) << 7; 
    
  • 바로 소자 (arr[i] >> 1)를 이동하고, 상기 이전 요소의 최하위 비트를 설정 가장 높은 (예 : 8) 비트 ((arr[i - 1] & 1) << 7) :

    :

    int i; 
    for(i = N - 1; i > 0; i--) { 
        arr[i] >>= 1;      // Right shift the (i)th byte 
        arr[i] |= (arr[i - 1] & 1) << 7; // Carry from the previous digit 
    } 
    
  • 오른쪽 시프트 및 첫 번째 요소에 circular_carry 추가