2008-08-29 5 views
33

난 당신이 너무 멀리 이동하면, 비트는 결국 떨어지지 다음은C#에서 순환 비트 시프트를 수행하는 방법이 있습니까?

int i = 17; //binary 10001 
int j = i << 1; //decimal 34, binary 100010 

참되다는 것을 알고 있지만. 이것이 일어나는 곳은 작업하는 정수의 크기입니다.

비트가 다른쪽으로 돌아가도록 시프트를 수행하는 방법이 있습니까? for 루프가 아닌 단일 작업을 찾고 있습니다. 이 유형의 크기를 알고있는 경우

+0

이 유형의 작동은 어디에 사용됩니까? Bit Rotate의 목적은 무엇입니까? 나는 알 필요가 없지만 지식을 확장하는 것에 관심이 있습니다. Keith –

+0

아주 좋은 질문입니다. 난 그냥 생성 된 코드를 확인하고 C# 컴파일러는 CPU의 회전 명령을 사용하는 코드를 생성하지 않습니다 (x86 아키텍처가 8086 이후로는 아닙니다 ...). 이것은 부끄러운 일이다. C가이 최적화를 수행합니다. 또한 회전은 암호화 및 dsp 작업에 매우 중요합니다. –

답변

45

, 당신이 뭔가를 할 수 있습니다 : 32 비트 값의 원형 이동을 수행 할

uint i = 17; 
uint j = i << 1 | i >> 31; 

.... 순환 시프트 일반화로서

은 B 비트 변수를, N 비트 남아

/*some unsigned numeric type*/ input = 17; 
var result = input << n | input >> (b - n); 


@The 주석, C 번호 다르게 서명 값의 상위 비트를 처리 않는 것으로 보인다. 이 here에 대한 정보를 발견했습니다. 또한 uint를 사용하도록 예제를 변경했습니다. 내가 인정해야

+1

C#을 모르므로 시프트 연산자가 산술 또는 논리 시프트를하고 있습니까? 산술 인 경우이 알고리즘은 64 비트 부호있는 정수에는 사용할 수 없습니다. – tzot

+0

아마도 'int'와 'var'형식 모두 'unsigned'한정자가 접두어로 사용되어야합니다. 물론 C#에서는이를 허용합니다. – tzot

+0

잡기에 감사드립니다. –

9

하나 년 전 발견했다. 여기 UInt32를 사용하여 순환 비트 시프트를 구현했습니다.

private UInt32 RotateLeft(UInt32 x, Byte n) 
{ 
     return UInt32((x << n) | (x >> (32 - n))); 
} 
3

은 그냥 작업을 수행하는 방법에 대한 참고 자료로,이 두 가지 기능은 1/2 워드의 비트를 회전 완벽하게 작동 :

static public uint ShiftRight(uint z_value, int z_shift) 
{ 
    return ((z_value >> z_shift) | (z_value << (16 - z_shift))) & 0x0000FFFF; 
} 

static public uint ShiftLeft(uint z_value, int z_shift) 
{ 
    return ((z_value << z_shift) | (z_value >> (16 - z_shift))) & 0x0000FFFF; 
} 

주어진 크기를 확장하기 쉬운 것입니다.

0

가장 유명한 응용 프로그램은 Josephus 문제에 대한 해결책입니다 (구체적인 수학에서 논의 됨, http://oeis.org/A006257 참조). 기본적으로 분명한 응용 프로그램이없는 퍼즐입니다. this video에서 나는 2 차 요세푸스 문제와 완전한 균형 잡힌 나무 사이의 연관성을 보여주었습니다. 아직 응용 프로그램이 아니지만 올바른 방향으로 약간 움직입니다.

관련 문제