Необходимо ли было когда-либо использовать бит, переключающий реальные проекты на нижний регистр?

В моей системе (Ubuntu 17.10) ваш пример работает по желанию, как при вводе из командной строки (в sh), так и при исполнении сценария sh:

[bash]§ sh
$ STR="Hello\nWorld"
$ echo $STR
Hello
World
$ exit
[bash]§ echo "STR=\"Hello\nWorld\"
> echo \$STR" > test-str.sh
[bash]§ cat test-str.sh 
STR="Hello\nWorld"
echo $STR
[bash]§ sh test-str.sh 
Hello
World

Я думаю, это отвечает на ваш вопрос: он просто работает. (Я не пытался разобраться в деталях, например, в какой момент точно замена подписи символа новой строки для \n происходит в sh).

Однако я заметил, что этот же скрипт будет вести себя по-другому при выполнении с bash и вместо этого распечатайте Hello\nWorld:

[bash]§ bash test-str.sh
Hello\nWorld

Мне удалось получить желаемый результат с помощью bash следующим образом:

[bash]§ STR="Hello
> World"
[bash]§ echo "$STR"

Обратите внимание на двойные кавычки вокруг $STR. Это ведет себя одинаково, если сохраняется и выполняется как сценарий bash.

Следующее также дает желаемый результат:

[bash]§ echo "Hello
> World"
79
задан 3 revs, 2 users 100% 8 February 2009 в 22:56
поделиться

42 ответа

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

0
ответ дан Pablote 6 November 2019 в 02:46
поделиться

Я использовал его в вычислении CRC.

0
ответ дан Michał Piaskowski 6 November 2019 в 02:46
поделиться

Другая очень распространенная вещь - сделать 4-битный сдвиг при извлечении большого куска из байт, т.е.

#define HIGH_NIBBLE(byte) (((byte) >> 4) & 0x0F)
#define LOW_NIBBLE(byte)  ( (byte)       & 0x0F)
1
ответ дан hlovdal 24 November 2019 в 10:08
поделиться

Используется сдвиг битов много в расшифровке протоколов онлайн-игр. Протоколы разработаны так, чтобы использовать как можно меньшую полосу пропускания, поэтому вместо передачи числа проигрывателей на сервере, имен и т. Д. В int32s вся информация упаковывается в как можно меньшее количество байтов. В наши дни это не так уж необходимо, поскольку большинство людей используют широкополосный доступ, но когда они были изначально спроектированы, люди использовали 56k модемы для игр, поэтому каждый бит учитывается.

Наиболее яркие примеры этого есть в Valve ' s многопользовательские игры, в частности Counter-Strike, Counter-Strike Source. Протокол Quake3 также тот же, но Unreal не такой тонкий.

Вот пример (.NET 1.1)

string data = Encoding.Default.GetString(receive);

if ( data != "" )
{
    // If first byte is 254 then we have multiple packets
    if ( (byte) data[0] == 254 )
    {
        // High order contains count, low order index
        packetCount = ((byte) data[8]) & 15; // indexed from 0
        packetIndex = ((byte) data[8]) >> 4;
        packetCount -= 1;

        packets[packetIndex] = data.Remove(0,9);
    }
    else
    {
        packets[0] = data;

    }
}

. Конечно, рассматривать это как реальный проект или просто как хобби (в C #) до вас.

2
ответ дан Chris S 24 November 2019 в 10:08
поделиться

Я проделал некоторую работу с новыми криптоструктурами, скрывая сериализованные структуры (и последующие обновления для них) за гомоморфными сумматорами , Много хэшей также зависит от битовых операций; сдвиг среди них.

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

Также выполнялись проекты сжатия (в частности, GZIP), где вам нужно довольно часто упаковывать биты; я не могу представить, что получу это без << и >> (или >>>, если вы на Java).

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

0
ответ дан Kevin Montrose 24 November 2019 в 10:08
поделиться

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

Вместо того, чтобы искать в хранилище данных SKU, соответствующий параметрам пользователя, каждая комбинация параметров соответствует определенному хешу, который на самом деле был числом, созданным с использованием битовой математики. Я допустил 4 бита (16 комбинаций) для каждой опции, до пяти опций, итого 20 бит. Чтобы вычислить хеш из параметров пользователя, я бы перебрал каждый пронумерованный атрибут, добавляя к значению хеша:

for(var i = 0; i < getSku.arguments.length; i++)
{
    index = getAttributeIndex(i, getSku.arguments[i]);
    hash += (index+1) << (4*i);
}

Это было немного быстрее, чем прохождение по сотням SKU, каждый раз сравнивая до 5 значений.

0
ответ дан Annika Backstrom 24 November 2019 в 10:08
поделиться

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

0
ответ дан user35978 24 November 2019 в 10:08
поделиться

Конечно. Работа с масками сродства использует битовый сдвиг.

Например, вы можете захотеть ограничить приложение использованием не более определенного количества процессоров (чтобы брать деньги за использование каждого процессора) - вы будете использовать битовые сдвиги для подсчета битов в маске сродства?

{{ 1}}
0
ответ дан sharptooth 24 November 2019 в 10:08
поделиться

Я использовал их в программе оценки покерных комбинаций.

Покерная комбинация представлена ​​как 64-битовое целое число без знака с битом 1 для каждой карты, которая присутствует в руке. С помощью комбинации сдвига и маскирования вы можете задавать такие вопросы, как «дайте мне все ранги, для которых у меня в руке есть как минимум 3 карты» и т. Д.

Это достаточно быстро, но с тех пор я узнал о более быстрых методах, где рука представлена ​​как массив байтов.

0
ответ дан 24 November 2019 в 10:08
поделиться

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

Также анализируются пакеты, содержащие звук и видео - я полагаю, что даже теги MP3 используют несколько битов.

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

0
ответ дан 24 November 2019 в 10:08
поделиться

Я использовал его для реализации преобразования между UTF-8 и UTF-32.

0
ответ дан 24 November 2019 в 10:08
поделиться

Да.

Сдвиг битов чрезвычайно полезен во встроенных приложениях, когда память ограничена, а скорость решает все.

Например, вместо дорогостоящей операции умножения вы можете выполнить те же вычисления, используя только сложение и битовые сдвиги, что значительно сэкономит время:

c := 0
while b != 0
    if (b and 1) != 0
        c := c + a
    shift a left by one
    shift b right by one
return c
0
ответ дан 24 November 2019 в 10:08
поделиться
Другие вопросы по тегам:

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