C# поразрядно поворачивают оставленный и поворачивают право

Проблема довольно проста. Вы звоните close на BufferedWriter.

else {
   r.write(message);
   r.newLine();
}

r.close();

Javadoc для BufferedWriter#close состояний

Закрывает поток, сбрасывая его первым. Как только поток будет закрыт, дальнейшие вызовы write () или flush () вызовут IOException .


Вы также пишете в один и тот же файл, используя два разных объекта. Я рекомендую вам придерживаться одного и угробить другого.

34
задан Ajay 15 January 2016 в 17:25
поделиться

3 ответа

Это то, что вы пытаетесь сделать?

Джон Скит ответил на это на другом сайте

По сути, вы хотите

(слева)

(original << bits) | (original >> (32 - bits))

или

(справа)

(original >> bits) | (original << (32 - bits))

Кроме того, как уже говорил Мехрдад, это работает только для uint, что является примером, который также приводит Джон.

42
ответ дан 27 November 2019 в 16:19
поделиться

Наивная версия переключения не будет работать. Причина в том, что смещенные вправо числа со знаком заполнят левые биты знаковым битом , а не 0 :

Этот факт можно проверить с помощью:

Console.WriteLine(-1 >> 1);

Правильный путь:

public static int RotateLeft(this int value, int count)
{
    uint val = (uint)value;
    return (int)((val << count) | (val >> (32 - count)));
}

public static int RotateRight(this int value, int count)
{
    uint val = (uint)value;
    return (int)((value >> count) | (value << (32 - count)));
}
9
ответ дан 27 November 2019 в 16:19
поделиться

В C # нет встроенной функции языка для ротации битов, но эти методы расширения должны выполнять свою работу:

public static uint RotateLeft(this uint value, int count)
{
    return (value << count) | (value >> (32 - count))
}

public static uint RotateRight(this uint value, int count)
{
    return (value >> count) | (value << (32 - count))
}

Примечание: Как указывает Мерадад, сдвиг вправо ( >> ) для целых чисел со знаком - особенность: он заполняет MSB знаковым битом, а не 0, как для чисел без знака. Вместо этого я изменил методы для взятия и возврата uint (32-разрядное целое число без знака) - это также в большей степени соответствует C ++ rotl и rotr функции. Если вы хотите повернуть целые числа, просто введите их перед передачей и снова приведите возвращаемое значение, конечно.

Пример использования:

int foo1 = 8.RotateRight(3); // foo1 = 1
int foo2 = int.MinValue.RotateLeft(3); // foo2 = 4

(Обратите внимание, что int.MinValue равно 111111111111111111111111 - 32 1s в двоичный файл.)

23
ответ дан 27 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: