*.ext~
файл является файлом резервной копии, содержа файл, как это было перед редактированием его.
*.ext.swp
файл является файлом подкачки, который служит файлом блокировки и содержит историю отмены/восстановления, а также любые другие внутренние информационные потребности Vim. В случае катастрофического отказа можно вновь открыть файл, и Vim восстановит свое предыдущее состояние от файла подкачки (который я нахожу полезными, таким образом, я не выключаю его).
Для выключения автоматического создания файлов резервных копий используйте (в vimrc):
set nobackup
set nowritebackup
, Где nowritebackup
изменения поведение "сохранения" по умолчанию Vim, который является:
, и заставляет Vim записать буфер в исходный файл (приводящий к риску уничтожения его в случае ошибки ввода-вывода). Но Вы предотвращаете "переходящие файлы" на рабочем столе Windows с ним, который является основной причиной меня, чтобы иметь nowritebackup
на месте.
В отношении подобных битовых масок следует обратить внимание на то, что они всегда на единицу меньше степени двойки.
Выражение 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".
Для тех, кто интересуется, это альтернатива таблицы поиска, обсуждаемая в комментариях к другому ответу - разница в том, что она работает правильно для параметра 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
.