软件研发

如何在C和C ++中操作位?

2020-07-23 14:58:38 | 来源:中培企业IT培训网

计算机中的所有数据均以二进制表示,即0或1。计算机不理解我们的语言,它们理解位。通常,程序员并不关心位级别的操作。那么如何在C和C ++中操作位?位表示在编程中,将n位整数存储为由n位组成的二进制数。因此,一个32位整数由32位组成,而64位整数,由64位组成。在C ++编程语言中,int数据类型为16位,32位和64位类型。

  位表示

这是32位整数数字10的位表示形式:

00000000000000000000000000001010

在C ++中,int是带符号的或无符号的,因此位表示形式是带符号的或无符号的。

在带符号的表示中,第一位表示数字的符号(0表示正,1表示负),其余n-1位包含数字的大小。

有符号和无符号表示之间存在联系。签名号码:

-x 等于一个无符号数2^n – x。

-x (signed) = 2^n - x (unsigned)

int a = -10;

unsigned int b = a;

std::cout << a << " ";

/* -10 */std::cout << b << " ";

/* 4294967286 */

在签名表示中,下一个数字2^(n – 1) – 1是-2^n – 1,并且以无符号表示形式,是下一个数字2^n – 1是0。

  位操作

我们可以使用&运算符检查数字是偶数还是奇数。如果x & 1 = 0然后x甚至x & 1 = 1然后x很奇怪 我们也可以这样说x被...整除2^k确切的时间x & (2^k – 1)= 0.x<>k对应于除法x通过2^k四舍五入为整数。

  通用位任务

unsigned int的二进制表示形式:

void binary(unsigned int num)

{

for(int i = 256; i > 0; i = i/2) {

if(num & i)

std::cout << "1 ";

else

std::cout << "0 ";

}

std::cout << std::endl;

}

将位设置在位置:

int set_bit(int num, int position)

{

int mask = 1 << position;

return num | mask;

}

获取位的位置:

bool get_bit(int num, int position)

{

bool bit = num & (1 << position);

return bit;

}

在清零位置:

int clear_bit(int num, int position)

{

int mask = 1 << position;

return num & ~mask;

}

  代表集

整数的位表示为0索引,并且索引从右侧(即最低有效位)开始。这样我们就可以代表集合的每个子集{0, 1, 2, ..., n-1}作为n位整数,其位指示哪个元素属于该子集。如果在数字的二进制表示中索引3的位为1,索引4的位为0,则3属于该子集,而4不属于该子集。

对于32位整数,集合为{0,1,2,…,31},子集为{1、3、4、8}。该集合的二进制表示形式是:00000000000000000000000100011010,十进制表示形式是2 ^ 8 + 2 ^ 4 + 2 ^ 3 + 2 ^ 1 = 282。

  代码形成子集并向其中添加元素:

int add_elements_to_subset()

{

int subset = 0;

subset = subset | (1 << 1);

subset = subset | (1 << 3);

subset = subset | (1 << 4);

subset = subset | (1 << 8);

return subset;

}

打印子集元素的代码:

void printing_subset(int subset)

{

for (int i = 0; i < 32; i++)

{

if (subset & (1 << i)) std::cout << i << " ";

}

}

  附加功能

g ++编译器提供以下用于计数位的功能:

•__builtin_clz(x):数字开头的零个数字

•__builtin_ctz(x):数字结尾处的零数字

•__builtin_popcount(x):数字中的个数

•__builtin_parity(x):1的奇偶校验(偶数或奇数)

通过上述介绍,如何在C和C ++中操作位的相信大家已经清楚了吧,想了解更多关于编程语言的信息,请继续关注中培伟业。

标签: C