Побитовые операции в C # - PullRequest
       4

Побитовые операции в C #

3 голосов
/ 23 февраля 2011

Есть ли более короткая и привлекательная альтернатива

(b == 0) ? 0 : 1;

в терминах побитовых операций?

Кроме того, чтобы получить правильный знак (-1, 0 или 1) данного целого числа a В настоящее время я использую

(a > 0) ? 1 : (a >> 32);

Есть ли более короткие (но не более медленные) пути?

Ответы [ 3 ]

6 голосов
/ 23 февраля 2011

Лично я бы выбрал первый вариант для вашего варианта «равно нулю или нет».

Для знака целого я бы использовал Math.Sign ипредположим, что JIT-компилятор собирается встроить его - проверяя это предположение с помощью эталонных тестов, если оно оказывается потенциальным узким местом.

Прежде всего подумайте о читабельности - ваш первый фрагмент кода ослепительно очевиден.Твой второй нет.Я даже не уверен, что ваш второй кусок кода работает ... Я думал, что сдвиги вправо были эффективно замаскированы до нижних 5 бит, предполагая, что это Int32 (int).

РЕДАКТИРОВАТЬ: только что отмечен, и ваш текущий второй кусок кода эквивалентен:

int y = x > 0 ? 1 : x;

Смещение даже не заканчивается в скомпилированном коде.

Воспринимайте это как наглядный урок о том, как заботиться о микрооптимизации больше, чем о удобочитаемости. Сделать код работающим намного проще, если его легко понять.Если ваш код дает неправильный результат, мне все равно, как быстро он работает.

4 голосов
/ 23 февраля 2011

Микрооптимизации - корень всего зла .Вы жертвуете читаемостью на наносекунду.Это плохая сделка

1 голос
/ 23 февраля 2011

с точки зрения побитовых операций ... Может Кто-нибудь, пожалуйста, укажите это мне? Также, чтобы получить правильный знак (-1, 0 или 1) данного целого числа я в настоящее время используя

(a > 0) ? 1 : (a >> 32); 

Армен Цирунян и Джон Скит ответили на ваш технический вопрос, я попытаюсь объяснить некоторые технические заблуждения, которые у вас, по-видимому, есть.

Первая ошибка заключается в том, что если у вас есть 32-разрядное целое число со знаком и вы пытаетесь сместить его на 32, вы пытаетесь посмотреть на 33-й бит, который в случае со знаком 2-го числа будет представлять собой бит переполнения. * * 1008

Вторая ошибка, когда у вас есть 32-битное двоичное значение со знаком. Последний бит будет либо единица, либо ноль. Существует только одно нулевое значение. Таким образом, ваше заявление о попытке выяснить, является ли знак (-1,0,1), ясно указывает на то, что вы не понимаете этот факт. Если бит со знаком равен 1, число будет отрицательным, если оно равно нулю, оно будет положительным. Структуры, которые обрабатывают число по большей части в .NET Framework, не знают о дополнении 2 и дополнении 1. Это, конечно, не означает, что вы не можете расширить эту функциональность или просто преобразовать целое число со знаком в число дополнения до 2 (честно, очень просто).

Я должен добавить, что есть только одно значение для нуля, когда у вас есть целое число со знаком. Я полагаю, что это была моя главная проблема с вашим заявлением «проверь знак», которое показывает неправильное представление о двоичных числах.

http://en.wikipedia.org/wiki/Signed_magnitude#Sign-and-magnitude

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...