16位数字的按位运算

时间:2014-06-10 09:14:27

标签: c++

我无法弄清楚如何创建一个16位的int并设置/ maniuplate所有单独的位。如果我希望我的int以16位= 0开始,代码是什么?

如果我将我的int声明为

int16_t bitNum = 0; 

这与0000000000000000相同吗?我如何访问各个位的值?谢谢你的时间。

2 个答案:

答案 0 :(得分:4)

  

这与0000000000000000相同吗?

  

如何访问各个位的值?

您无法访问真正的单个位,因为较小的变量计算机可以寻址和分配的是char(char变量具有在给定计算机上保存字符的自然大小)。但您可以使用位掩码(和按位操作)来操作每个位

temp & (1 << N) // this will test N-th bit

或在C ++中,您可以使用std::bitset来表示位序列。

#include <bitset>
#include <iostream>
#include <stdint.h>

int main()
{
    uint16_t temp = 0x0;
    std::bitset< 16>   bits( temp);

    // 0 -> bit 1
    // 2 -> bit 3
    std::cout << bits[2] << std::endl;
}

这就是Bjarne Stroustrup关于“C ++ Prog ... 3d edition”中位操作的说法17.5.3 Bitset:

  

C ++有效地支持小组标志的概念   对整数的按位运算(第6.2.4节)。这些操作包括&amp;   (和), | (或), ^ (独占或),&lt;&lt; (左移)和&gt ;&gt; (转移   对)。

嗯,还有,按位补码运算符,波浪号,翻转每一位。

  

类位集概括了这个概念并提供了更多   通过对从0开始索引的一组N位提供操作来提供便利   通过N-1,其中N在编译时已知。对于那些位组   使用bitset不适合long int比使用方便得多   直接使用整数。对于较小的套装,可能会有效率   交易。如果要为这些位命名,而不是对它们进行编号,   使用(§17.4.3),枚举(§4.8)或位域(§C.8.1)   是替代品。 (...)bitset设计的一个关键思想是可以为适合单个字的位集提供优化的实现。界面反映了这种假设。

所以有其他选择,即另一种选择是使用位域。它们是作为结构中的字段捆绑在一起的二进制变量。然后,您可以使用访问运算符访问每个“位”:。供参考或 - &gt;指针。

struct BitPack {
    bool b1 :  0;
    bool b2 :  0;
    //...
    bool b15 : 0;
};

void f( BitPack& b)
{
  if( b.b1) // if b1 is set
      g();
}

链接:

http://en.cppreference.com/w/cpp/utility/bitset

http://en.cppreference.com/w/cpp/language/bit_field

答案 1 :(得分:1)

将整数类型的对象设置为零意味着将所有使用的位设置为零。

你可以写两个函数。一个将设置一个指定的位(从0开始),另一个将复位指定的位。例如

#include <iostream>
#include <cstdint>

inline uint16_t & set( uint16_t &bitNum, size_t n )
{
    return ( bitNum |= 1 << n );
}

inline uint16_t & reset( uint16_t &bitNum, size_t n )
{
    return ( bitNum &= ~( 1 << n ) );
}

int main()
{
    uint16_t bitNum = 0;

    for ( size_t i = 0; i < 16; i++ )
    {
        std::cout << set( bitNum, i ) << std::endl;
        reset( bitNum, i );
    }

    return 0;
} 

输出

1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768

另一种方法是使用标题std::bitset中声明的标准类<bitset>它已经具有相应的函数。

例如

#include <iostream>
#include <bitset>

int main()
{
    std::bitset<16> bitNum;

    for ( size_t i = 0; i < 16; i++ )
    {
        std::cout << bitNum.set( i ) << std::endl;
        bitNum.reset( i );
    }

    return 0;
} 

输出

0000000000000001
0000000000000010
0000000000000100
0000000000001000
0000000000010000
0000000000100000
0000000001000000
0000000010000000
0000000100000000
0000001000000000
0000010000000000
0000100000000000
0001000000000000
0010000000000000
0100000000000000
1000000000000000

享受:!)