문제

나는 다음 내용이 사실이라는 것을 알고 있습니다.

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

그러나 너무 멀리 이동하면 비트가 끝에서 떨어집니다.이런 일이 발생하는 곳은 작업 중인 정수 크기의 문제입니다.

비트가 반대쪽으로 회전하도록 시프트를 수행하는 방법이 있습니까?for 루프가 아닌 단일 작업을 찾고 있습니다.

도움이 되었습니까?

해결책

유형의 크기를 알고 있다면 다음과 같이 할 수 있습니다.

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

...32비트 값의 순환 이동을 수행합니다.

b 비트 변수에서 n 비트 왼쪽 순환 시프트에 대한 일반화:

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


@댓글, C#에서는 부호 있는 값의 상위 비트를 다르게 처리하는 것으로 보입니다.이것에 대한 정보를 찾았어요 여기.또한 uint를 사용하도록 예제를 변경했습니다.

다른 팁

1년 전에 저는 학부 논문을 위해 MD4를 구현해야 했습니다.여기에서는 UInt32를 사용하여 순환 비트 이동을 구현했습니다.

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

수행 방법에 대한 참조와 마찬가지로 이 두 기능은 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;
}

주어진 크기에 맞게 확장하는 것은 쉬울 것입니다.

가장 유명한 응용 프로그램은 Josephus 문제에 대한 솔루션입니다(Concrete Mathematics에서 논의된 바와 같이, http://oeis.org/A006257).이것은 기본적으로 명확한 적용이 없는 퍼즐입니다.~ 안에 이 비디오, 나는 2차 요세푸스 문제와 완전한 균형나무 사이의 연관성을 증명했습니다.아직은 적용은 아니지만 약간 올바른 방향으로 움직이고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top