此程序使用两个嵌套循环,外部循环遍历32种可能的整数,内部循环遍历每个整数的二进制表示的每一位,并输出。这样可以按照从小到大的顺序输出32种01串。
/*
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>
*/
#include <iostream>
using namespace std;
int main(void)
{
// 遍历32种可能的01串
for (int i = 0; i < 32; i++)
{
// 将整数转换为对应的二进制表示
for (int j = 4; j >= 0; j--)
{
// 通过位运算获取每一位的值
int bit = (i >> j) & 1;
cout << bit;
}
cout << endl;
}
return 0;
}
位运算符
C ++语言继承了 C 语言能进行位运算的优点,提供了6个位运算符,分别为"~"(按位求反)、"&"(按位与)、""(按位或)、""(按位异或)、">>"(右移位)、"<<"(左移位)。其中,"~"是单目运算符,其余都是双目运算符。
位运算符可以对操作数按二进制形式逐位进行运算,参与运算的操作数都应为整数,不能是实型数。
(1)"~"运算符的作用是对一个二进制数的每一位求反,即0→1,1→0。
(2)"&"运算符的作用是对两个操作数对应的每一位分别进行逻辑与操作。两个操作数对应位都是1,则该位运算结果为1,否则该位运算结果为0。
(3)"1"运算符的作用是对两个操作数对应的每一位分别进行逻辑或操作。两个操作数对应位中有1位是1,则该位运算结果为1,否则该位运算结果为0。
(4)""作用是对两个操作数对应的每一位分别进行逻辑异或操作。两个操作数对应位的值不同,则该位运算结果为1,否则该位运算结果为0。
(5)">>"运算符的作用是将左操作数的各二进制位右移,溢出的低位舍弃,对无符号数和有符号数中的正数,高位补0;对有符号数中的负数,有些系统补0,有些系统补1,右移位数由右操作数给出。右移1位相当于将操作数除以2。例如,表达式4>>1的结果为2。
(6)"<<"运算符的作用是将左操作数的各二进制位左移,低位补0,高位溢出部分舍弃,左移位数由右操作数给出。左移1位相当于将操作数乘以2。例如,表达式4<<1的结果为8。
int bit = (i >> j) & 1;
这行代码主要用于提取整数 i
的二进制表示中的每一位,并将提取的位值存储在变量 bit
中。让我们通过一个例子来说明:
假设 i
的值为 10(二进制表示为 1010),我们将遍历该整数的二进制表示的每一位:
- j = 4:
(10 >> 4) & 1
,右移4位后得到 0,0 & 1
结果为 0,所以bit = 0
。 - j = 3:
(10 >> 3) & 1
,右移3位后得到 1,1 & 1
结果为 1,所以bit = 1
。 - j = 2:
(10 >> 2) & 1
,右移2位后得到 10(二进制),10 & 1
结果为 0,所以bit = 0
。 - j = 1:
(10 >> 1) & 1
,右移1位后得到 101(二进制),101 & 1
结果为 1,所以bit = 1
。 - j = 0:
(10 >> 0) & 1
,右移0位后得到 1010(二进制),1010 & 1
结果为 0,所以bit = 0
。
因此,对于整数 i = 10
,这个循环将输出二进制表示 1010
的每一位。在这个特定的例子中,bit
将依次取值 0, 1, 0, 1
,这就是我们从右向左提取的每一位的值。