Czy istnieje sposób na wykonanie okrągłego przesunięcia bitów w C#?

Wiem, że to prawda

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

Ale jeśli przesuniesz się zbyt daleko, bity spadną z końca. Tam, gdzie to się dzieje, jest kwestią wielkości liczby całkowitej, z którą pracujesz.

Czy istnieje sposób, aby wykonać przesunięcie tak, że bity obracają się wokół na drugą stronę? Szukam pojedynczej operacji, nie pętli for.

Author: tzot, 2008-08-29

5 answers

Jeśli znasz rozmiar Typu, możesz zrobić coś takiego:

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

... które wykonywałyby okrągłe przesunięcie wartości 32-bitowej.

Jako uogólnienie do kołowego przesunięcia w lewo n bitów, na zmiennej bitowej b:

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


@Komentarz, wygląda na to, że C# traktuje wysoki bit podpisanych wartości inaczej. Znalazłem kilka informacji na ten tutaj . Zmieniłem również przykład, aby użyć uint.
 46
Author: Chris Marasti-Georg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 16:43:53

Rok temu muszę wdrożyć MD4 do pracy licencjackiej. Oto moja implementacja circular bit shift przy użyciu UInt32.

private UInt32 RotateLeft(UInt32 x, Byte n)
{
      return UInt32((x << n) | (x >> (32 - n)));
}
 10
Author: jaircazarin-old-account,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 19:18:46

Jako odniesienie do tego, jak to zrobić, te dwie funkcje działają idealnie do obracania bitów 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;
}

Łatwo byłoby go rozszerzyć o dowolny rozmiar.

 3
Author: yeyeyerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 12:35:51
 0
Author: Chris Blackwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 19:57:54

Najbardziej znanym zastosowaniem jest rozwiązanie problemu Josephusa (omówionego w matematyce konkretnej, Patrz http://oeis.org/A006257 ). jest to w zasadzie zagadka bez oczywistych zastosowań. W tym filmie, zademonstrowałem powiązania pomiędzy problemem Josephusa drugiego rzędu a kompletnymi drzewami zrównoważonymi. Nadal nie jest to aplikacja, ale poruszająca się nieco we właściwym kierunku.

 0
Author: Dale Gerdemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-07 18:52:53