2015-12-04 2 views
0

Я хочу установить бит на целое число, но без создания битовой маски, чтобы помочь мне.Как установить бит в целое число без использования битовой маски

Пример: а = 128 и MASC = 00000001 ... & MASC = 10000001

Пример того, как сделать это с битовой маской:

int y,masc; 
int a=128; 
masc=0x01; 
y=a|masc; 
cout<<y; 

вопрос сейчас: Есть способ сделать это без битовой маски и, если возможно, короче, чем этот код?

+0

Пожалуйста, покажите код. –

+0

@MichaelWalz Я немного забил это в форму. – Magisch

+0

Что случилось с 'y = a | mask'? Это уже очень коротко. –

ответ

-1

Вы можете попробовать макрос как этот

#define SET_BIT(data, bit) (data) |= 1 << (bit);  

Использование

int num = 0; 
SET_BIT(num, 2); // num = 4 
1

Есть целый ряд различных способов сделать это, но это сложно, чтобы предложить «лучшее» решение, не зная, почему просто использование битовой маски - проблема. Например, вы могли бы использовать вспомогательную функцию по линиям:

template< typename BITS> inline BITS set_bit(BITS data, size_t pos, bool val) 
{ 
    return (val) ? data | (1 << pos) : data & ~ (1 << pos); 
} 

unsigned int a = 128; 
a = set_bit(a, 0, true); 
std::cout << a << std::endl; // gives 129 = 10000001 
a = set_bit(a, 4, true); 
std::cout << a << std::endl; // gives 145 = 10010001 
a = set_bit(a, 7, false); 
std::cout << a << std::endl; // gives 17 = 00010001 

(Обратите внимание, что я не добавил проверку границ этого от параметра pos)

Другим способом сделать это может быть использовать битовое, который позволяет объявить имена переменных для отдельного бита и группы бит большего типа следующим образом:

struct MyBits { 
    unsigned int alpha : 1, 
       beta : 1, 
       gamma : 1; 
}; 

MyBits b; 
b.alpha = 1; 
b.gamma = 1; 

std::cout << b.alpha << std::endl; // gives 1 
std::cout << b.beta << std::endl; // gives 0 
std::cout << b.gamma << std::endl; // gives 1 

третьего пути - хотя это не строго с использованиемкак таковой - может быть использование BitSet для достижения аналогичной работы:

#include <bitset> 

std::bitset<8> c; 
c[0] = true; 
c[2] = true; 

std::cout << c[0] << std::endl; // gives 1 
std::cout << c[1] << std::endl; // gives 0 
std::cout << c[2] << std::endl; // gives 1 

Все они имеют свои преимущества и недостатки. Это во многом зависит от мотивационных факторов, стоящих за вашим вопросом.

0

В C++ (и в компьютерах в целом) у вас есть два типа операций: числовые и битовые операции. Поскольку вы хотите избежать последнего, вы должны использовать первое.

К счастью, между битами и числами существует простая связь. Биты в целых числах соответствуют степеням двух. Самый младший бит представляет 2^0 = 1, следующий 2^1 = 2 и т. Д.

Мы должны начать с самой высокой степенью двойки:

int p2 = (INT_MAX - INT_MAX/2); 

, а затем скопировать каждый набор бит над:

int result = 0 
while (p2 > 0) 
{ 
    if (a>p2) // This bit is set in a2, copy it. 
    { 
     result += p2; 
     a -= p2; 
    } 
    p2 /= 2; 
} 

кроме случаев, когда р2 бит вы хотите установить, конечно , Я оставлю эту часть упражнения вам.

Смежные вопросы