Проверка C/C++, если один бит установлен в, т.е. международная переменная

Предположим, что у вас есть следующий генератор:

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.

98
задан John Carter 7 February 2009 в 13:19
поделиться

11 ответов

В C, если Вы хотите скрыть побитовую обработку, можно записать макрос:

#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))

и использование это этот способ проверить n <глоток> th укусил от правильного конца:

CHECK_BIT(temp, n - 1)

В C++, можно использовать станд.:: bitset.

153
ответ дан Peeyush Kushwaha 5 November 2019 в 12:11
поделиться

если Вы просто хотите очень твердый кодированный путь:

 #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

0
ответ дан simon 5 November 2019 в 12:11
поделиться

Для низкого уровня x86 определенное использование решения ТЕСТ x86 код операции.

Ваш компилятор должен повернуться _bittest в это хотя...

2
ответ дан jheriko 5 November 2019 в 12:11
поделиться

Вы могли "моделировать" смещение и маскирование: если ((0x5e / (2*2*2)) %2)...

2
ответ дан Leonidas 5 November 2019 в 12:11
поделиться

Станд. использования:: 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;
}
5
ответ дан Martin York 5 November 2019 в 12:11
поделиться

Проверьте, установлен ли бит N (запускающийся от 0):

temp & (1 << N)

нет никакой встроенной функции для этого.

82
ответ дан Joao da Silva 5 November 2019 в 12:11
поделиться

Можно использовать Bitset - http://www.cppreference.com/wiki/stl/bitset/start .

6
ответ дан yawmark 5 November 2019 в 12:11
поделиться

Да, я знаю, что не делаю , "имеют" , чтобы сделать это этот путь. Но я обычно пишу:

    /* 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.

Среди других вещей, этого подхода:

  • Размещает целые числа бита 8/16/32/64.
  • Обнаруживает IsBitSet (int32, int64) вызовы без моего ведома & согласие.
  • Встроенный Шаблон, таким образом, никакой вызов функции наверху.
  • const& ссылки, таким образом, ничто потребности , чтобы копироваться/копироваться. И нам гарантируют это, компилятор возьмет любую опечатку, которые пытаются изменить аргументы.
  • 0! = делает код более ясным & очевидный. Основная точка к написанию кода должна всегда связываться ясно и эффективно с другими программистами, включая те из меньшего навыка.
  • , В то время как не применимый к этому конкретному случаю... В целом шаблонные функции избегают проблемы оценки аргументов многократно. Известная проблема с некоторыми #define макросами.
    , Например: #define ABS (X) (((X) < 0)? - (X): (X))
          ABS (я ++);
11
ответ дан Mr.Ree 5 November 2019 в 12:11
поделиться

Я просто использовал бы станд.:: 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);
24
ответ дан user21714 5 November 2019 в 12:11
поделиться

Согласно это описание битовых полей , существует метод для определения и доступа к полям непосредственно. Пример в этой записи идет:

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)
    /* ... */

кроме того, там существует предупреждение:

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

11
ответ дан gimel 5 November 2019 в 12:11
поделиться

Существует, а именно, _bittest внутренняя инструкция.

4
ответ дан Dave Van den Eynde 5 November 2019 в 12:11
поделиться