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.
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.
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)));
}
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.
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
Muszę przyznać, że właśnie poszukałem "C# bit rotate" i znalazłem link do strony z klasą Javy, która łatwo zaadaptowałaby się do C#
Znalazłem to również w Google Book, który jest funkcją C++ o podobnym zachowaniu
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.
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