Почему бит сдвигается? - PullRequest
10 голосов
/ 22 сентября 2011

Недавно я просматривал файл конфигурации, в котором сохранялись некоторые загадочные значения.У меня получился доступный источник, поэтому я посмотрел на то, что он делал, и он сохранял кучу разных значений и сдвигал их друг в друга.Меня озадачило, почему кто-то так поступил.Поэтому мой вопрос: есть ли очевидное преимущество для хранения числовых данных таким образом?Я могу видеть, как это может привести к немного меньшему значению для хранения, в байтовом выражении, но кажется, что требуется много работы, чтобы сэкономить пару байтов памяти.Также кажется, что это будет значительно медленнее.

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

Ответы [ 4 ]

11 голосов
/ 22 сентября 2011

Это один из распространенных способов сдвига битов. Есть несколько преимуществ:

1) Операции сдвига битов выполняются быстро.

2) Вы можете хранить несколько флагов в одном значении.

Если у вас есть приложение, которое имеет несколько функций, но вы хотите включить только некоторые (настраиваемые), вы можете сделать что-то вроде:

[Flags]
public enum Features
{
    Profile = 1,
    Messaging = 1 << 1,
    Signing = 1 << 2,
    Advanced = 1 << 3
}

И единственное значение для включения Messaging и Advanced будет:

(1 << 1) + (1 << 3) = 2 + 16 = 18

<add name="EnabledFeatures" value="18" />

А затем, чтобы выяснить, включена ли данная функция, вы просто выполняете простую побитовую математику:

var AdvancedEnabled = 
    EnabledFeatures & Features.Advanced == Features.Advanced;
5 голосов
/ 22 сентября 2011

Сдвиг битов чаще встречается в языках системного уровня, таких как C, C ++ и ассемблер, но я видел это здесь и там в C #. Однако он не так часто используется для экономии места, как по одной (или обеим) из двух типичных причин:

  • Вы говорите с существующей системой (или используете установленный протокол, или генерируете файл в известном формате), который требует, чтобы материал был очень точно выложен; и / или
  • Комбинация битов представляет собой значение, которое само по себе полезно для тестирования.

Любой, кто использует его на языке высокого уровня исключительно , чтобы сэкономить место или запутать свой код, почти всегда преждевременно оптимизирует (и / или идиот). Экономия пространства редко оправдывает добавленную сложность, а сдвиги битов на самом деле не настолько сложны, чтобы помешать кому-то понять ваш код.

4 голосов
/ 22 сентября 2011

У меня есть проект, который хранит дневную / часовую матрицу доступных часов в течение одной недели.Таким образом, у него есть значения 24x7, которые нужно каким-то образом хранить.

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

enter image description here

1 голос
/ 23 сентября 2011

Иногда (особенно в старом программировании Windows) будет информация, закодированная в битах «старшего» и «младшего» значения ... и иногда необходимо сдвигаться, чтобы получить информацию. Я не уверен на 100% в причинах этого, кроме того, что может быть удобно возвращать 64-битное значение с двумя 32-битными значениями, закодированными в нем (так что вы можете обработать его с помощью одного возвращаемого значения из метода звоните).

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

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