전체 36 바이트 데이터의 유형 변환 배열 uint8_t
이 있습니다. 전체 배열을 통해 비트을 순환하여 시프트하고 싶습니다 (오른쪽 시프트). 어떻게해야합니까? 예 :배열의 비트 순환 시프트
uint8_t arr[3] = {0x03, 0x44, 0x32}
한 시프트 후에는 같아야
arr[3] = {0x01, 0xa2, 0x19}
전체 36 바이트 데이터의 유형 변환 배열 uint8_t
이 있습니다. 전체 배열을 통해 비트을 순환하여 시프트하고 싶습니다 (오른쪽 시프트). 어떻게해야합니까? 예 :배열의 비트 순환 시프트
uint8_t arr[3] = {0x03, 0x44, 0x32}
한 시프트 후에는 같아야
arr[3] = {0x01, 0xa2, 0x19}
다음 코드로 배열을 순환 시프트 할 수 있습니다. 거의 자명하지 못하다. 당신이 값을 마우스 오른쪽 시프트로 가장 낮은 비트를 잃게
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
반복 전에 savedCarry
은 carry
에 복사되어 다음 배열 값 (다음 반복시)에서 가장 높은 비트를 설정합니다.
루프 배열의 각 바이트를 통하여. 각 바이트에 대해 먼저 낮은 비트를 확인하고 설정되어 있으면 캐리 아웃 플래그를 설정하십시오. 그런 다음 바이트를 하나씩 이동할 수 있습니다.
다음 바이트에 대해 위 내용을 반복하되 먼저 carry-in 플래그를 carry-out 플래그의 현재 값으로 설정하십시오. 이동 후에는 캐리 인 플래그를 확인하고 설정되어 있으면 현재 바이트의 상위 비트를 설정합니다. 어레이의 끝 부분을 칠 때까지 계속하십시오. 캐리 아웃 플래그가 마지막에 설정되면 첫 번째 바이트의 상위 비트를 설정합니다.
가정 배열 인덱스이 될 것이라고 할 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
추가
비 원형 이동을 수행하는 방법을 알고 있습니까? 그리고 순환 시프트의 결과로 인해 여분의 바이트가 필요한 이유는 무엇입니까? –
오른쪽으로 회전이라고도하는 순환 시프트 오른쪽은 시퀀스의 최하위 비트가 최상위 비트로 순환된다는 것을 의미합니다. 0x03 회전 된 단일 바이트 예제를 사용하면 0x81이됩니다. 오른쪽으로 이동 한 값이 0x01 인 경우. 여기에 어느 것을 염두에두고 있습니까? –
@ PeterCamilleri - OP가 전체 배열의 비트를 회전 시키려고하고 있다고 생각합니다. 따라서 요소 'n'의 최하위 비트는 요소 'n + 1'의 최상위 비트가됩니다. 마지막 요소의 최하위 비트가 첫 번째 요소의 최상위 비트가됩니다. – Paolo