Предположим, что у вас есть следующий генератор:
def gen():
with open('important_file') as f:
for line in f:
yield line
, а вы next
один раз и выбрасываете его:
g = gen()
next(g)
del g
Управляющий поток генератора никогда не покидает with
, поэтому файл не закрывается. Чтобы предотвратить это, когда генератор собирает мусор, Python вызывает свой метод close
, который вызывает исключение GeneratorExit
в точке, из которой был создан генератор yield
. Это исключение предназначено для запуска любых блоков finally
или менеджера контекста __exit__
, которые не получили возможности запускать.
Когда вы ловите GeneratorExit
и продолжаете движение, Python видит, что генератор не вышел должным образом. Поскольку это может указывать на то, что ресурсы не были правильно выпущены, Python сообщает об этом как RuntimeError.
В C, если Вы хотите скрыть побитовую обработку, можно записать макрос:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
и использование это этот способ проверить n <глоток> th глоток> укусил от правильного конца:
CHECK_BIT(temp, n - 1)
В C++, можно использовать станд.:: bitset.
если Вы просто хотите очень твердый кодированный путь:
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
примечание этот hw зависимый и принимает этот разрядный порядок 7654 3210, и var составляет 8 битов.
#include "stdafx.h"
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
int _tmain(int argc, _TCHAR* argv[])
{
int temp =0x5E;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x00;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x04;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0xfb;
printf(" %d \n", IS_BIT3_SET(temp));
scanf("waitng %d",&temp);
return 0;
}
Результаты в:
1 0 1 0
Для низкого уровня x86 определенное использование решения ТЕСТ x86 код операции.
Ваш компилятор должен повернуться _bittest в это хотя...
Вы могли "моделировать" смещение и маскирование: если ((0x5e / (2*2*2)) %2)...
Станд. использования:: bitset
#include <bitset>
#include <iostream>
int main()
{
int temp = 0x5E;
std::bitset<sizeof(int)*CHAR_BITS> bits(temp);
// 0 -> bit 1
// 2 -> bit 3
std::cout << bits[2] << std::endl;
}
Проверьте, установлен ли бит N (запускающийся от 0):
temp & (1 << N)
нет никакой встроенной функции для этого.
Можно использовать Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
Да, я знаю, что не делаю , "имеют" , чтобы сделать это этот путь. Но я обычно пишу:
/* Return type (8/16/32/64 int size) is specified by argument size. */
template<class TYPE> inline TYPE BIT(const TYPE & x)
{ return TYPE(1) << x; }
template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y)
{ return 0 != (x & y); }
, Например:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
Среди других вещей, этого подхода:
Я просто использовал бы станд.:: bitset, если это - C++. Простой. Простой. Никакой шанс для глупых ошибок.
typedef std::bitset<sizeof(int)> IntBits;
bool is_set = IntBits(value).test(position);
или как насчет этой глупости
template<unsigned int Exp>
struct pow_2 {
static const unsigned int value = 2 * pow_2<Exp-1>::value;
};
template<>
struct pow_2<0> {
static const unsigned int value = 1;
};
template<unsigned int Pos>
bool is_bit_set(unsigned int value)
{
return (value & pow_2<Pos>::value) != 0;
}
bool result = is_bit_set<2>(value);
Согласно это описание битовых полей , существует метод для определения и доступа к полям непосредственно. Пример в этой записи идет:
struct preferences {
unsigned int likes_ice_cream : 1;
unsigned int plays_golf : 1;
unsigned int watches_tv : 1;
unsigned int reads_books : 1;
};
struct preferences fred;
fred.likes_ice_cream = 1;
fred.plays_golf = 1;
fred.watches_tv = 1;
fred.reads_books = 0;
if (fred.likes_ice_cream == 1)
/* ... */
кроме того, там существует предупреждение:
Однако у разрядных участников в структурах есть практические недостатки. Во-первых, упорядочивание битов в памяти является архитектурно-зависимым, и дополнительные правила памяти варьируется от компилятора до компилятора. Кроме того, много популярных компиляторов генерируют неэффективный код для чтения, и запись укусила участников, и существуют потенциально серьезные проблемы потокобезопасности, касающиеся битовых полей (особенно в многопроцессорных системах) вследствие того, что большинство машин не может управлять произвольными наборами битов в памяти, но должно вместо этого загрузить и сохранить целые слова.
Существует, а именно, _bittest внутренняя инструкция.