繁体   English   中英

16位数字的按位运算

[英]Bitwise Operations on a 16 bit number

我在弄清楚如何创建一个16位int并设置/处理所有单个位时遇到了麻烦。 如果我希望我的int以所有16位= 0开始,那代码应该是什么?

如果我将我的int声明为

int16_t bitNum = 0; 

这和0000000000000000一样吗? 以及如何访问各个位的值? 谢谢你的时间。

这和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节)进行按位运算,有效地支持小标志集的概念。 这些操作包括 (和), |。 (或), ^ (排除或), << (向左移动)和>> (向右移动)。

好吧, ,逐位补码运算符,波浪号,它翻转每一位。

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

因此,有其他选择,即另一种选择是使用bitfields 它们是二进制变量,它们作为结构中的字段捆绑在一起。 然后,您可以使用访问运算符来访问每个单独的“位”。 用于引用或->用于指针。

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

将整数类型的对象设置为零表示将其所有使用的位设置为零。

您可以编写两个函数。 一个将设置一个指定的位(从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

另一种方法是使用标头<bitset>声明的标准类std::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

请享用!:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM