如何在不使用位掩码的情况下在整数中设置位

时间:2015-12-04 08:18:40

标签: c++

我想在一个整数上设置一下,但是没有创建一个位掩码来帮助我。

示例:a = 128且masc = 00000001 ... a& masc = 10000001

如何使用位掩码执行示例:

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

现在的问题是:有没有一种方法可以在没有位掩码的情况下执行此操作,如果可能的话,可以缩短此代码?

3 个答案:

答案 0 :(得分: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

第三种方式 - 虽然这不是严格使用int - 可能是使用 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

所有都有其优点和缺点。这在很大程度上取决于你问题背后的激励因素。

答案 1 :(得分:0)

在C ++(以及一般的计算机)中,您有两种类型的操作:数字和位操作。既然你想避免后者,你必须使用前者。

幸运的是,位和数字之间存在简单的关联。整数位对应于2的幂。最低位表示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;
}

当然,除非p2是你要设置的位。我会把这部分练习留给你。

答案 2 :(得分:-1)

您可以尝试像这样的宏

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

用法

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