Алгоритм для генерации битовой маски

*.ext~ файл является файлом резервной копии, содержа файл, как это было перед редактированием его.

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

Для выключения автоматического создания файлов резервных копий используйте (в vimrc):

set nobackup
set nowritebackup

, Где nowritebackup изменения поведение "сохранения" по умолчанию Vim, который является:

  1. буфер записи в новый файл
  2. удаляет исходный файл
  3. , переименовывают новый файл

, и заставляет Vim записать буфер в исходный файл (приводящий к риску уничтожения его в случае ошибки ввода-вывода). Но Вы предотвращаете "переходящие файлы" на рабочем столе Windows с ним, который является основной причиной меня, чтобы иметь nowritebackup на месте.

42
задан Jeffrey Bosboom 25 February 2015 в 03:15
поделиться

2 ответа

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

Выражение 1 << n - самый простой способ чтобы получить n-ую степень двойки.

Вы не хотите, чтобы Zero предоставлял битовую маску 00000001 , вы хотите, чтобы она предоставляла ноль. Поэтому вам нужно вычесть единицу.

mask = (1 << param) - 1;

Изменить:

Если вам нужен специальный случай для param> 32:

int sizeInBits = sizeof(mask) * BITS_PER_BYTE; // BITS_PER_BYTE = 8;
mask = (param >= sizeInBits ? -1 : (1 <<  param) - 1);

Этот метод должен работать для 16, 32 или 64-битных целых чисел, но вам, возможно, придется явно ввести "1".

79
ответ дан 26 November 2019 в 23:25
поделиться

Для тех, кто интересуется, это альтернатива таблицы поиска, обсуждаемая в комментариях к другому ответу - разница в том, что она работает правильно для параметра 32. Достаточно легко расширить до 64 bit unsigned long long версия, если она вам нужна, и не должна существенно отличаться по скорости (если она вызывается в жестком внутреннем цикле, то статическая таблица останется как минимум в кэше L2, и если она не вызывается в жестком внутреннем цикле, тогда разница в производительности не будет иметь значения).

unsigned long mask2(unsigned param)
{
    static const unsigned long masks[] = {
        0x00000000UL, 0x00000001UL, 0x00000003UL, 0x00000007UL,
        0x0000000fUL, 0x0000001fUL, 0x0000003fUL, 0x0000007fUL,
        0x000000ffUL, 0x000001ffUL, 0x000003ffUL, 0x000007ffUL,
        0x00000fffUL, 0x00001fffUL, 0x00003fffUL, 0x00007fffUL,
        0x0000ffffUL, 0x0001ffffUL, 0x0003ffffUL, 0x0007ffffUL,
        0x000fffffUL, 0x001fffffUL, 0x003fffffUL, 0x007fffffUL,
        0x00ffffffUL, 0x01ffffffUL, 0x03ffffffUL, 0x07ffffffUL,
        0x0fffffffUL, 0x1fffffffUL, 0x3fffffffUL, 0x7fffffffUL,
        0xffffffffUL };

    if (param < (sizeof masks / sizeof masks[0]))
        return masks[param];
    else
        return 0xffffffffUL; /* Or whatever else you want to do in this error case */
}

Стоит отметить, что если вам нужен оператор if () (потому что вы беспокоитесь что кто-то может вызвать его с помощью param> 32 ), тогда это ничего не даст вам по сравнению с альтернативой из другого ответа:

unsigned long mask(unsigned param)
{
    if (param < 32)
        return (1UL << param) - 1;
    else
        return -1;
}

Единственное отличие состоит в том, что последняя версия имеет специальный случай param> = 32 , тогда как первая имеет только частный случай param> 32 .

7
ответ дан 26 November 2019 в 23:25
поделиться
Другие вопросы по тегам:

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