一.如何使用
>>1. 右移1位.相当于 /2
<<1 左移1位 相当于 *2
>>2 右移2位 相当与 /2的二次方
<<2 左移2位 相当与 *2的二次方
二. 按位与& ;每一位同是1才为1
或|; 有一位是1就是1
异^
同为0,异为1
三.位运算 案例实现 账户验证
首先enum之前有点模糊。
下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:
#define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7
这个看起来代码量就比较多,接下来我们看看使用枚举的方式:
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
这样看起来是不是更简洁了。
注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
可以在定义枚举类型时改变枚举元素的值:
enum season {spring, summer=3, autumn, winter};没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5
typedef enum Flag //系统标签
{
account_vertification = 0x1 << 0, //账户验证
password_vertification = 0x1 << 1,
payment_vertification = 0x1 << 2, //支付验证
};
// | 增加属性
char User1= 0; // 0000 0000 八位
User1 = account_vertification | password_vertification | payment_vertification;
printf("%d",User1);
//包含属性
if (User1 & account_vertification)
{
printf("通过账户验证");
}
User1 = User1 & ~account_vertification;
//清除属性 &
if (User1 & account_vertification)
{
printf("通过账户验证");
}
& 是验证通过。 User1 & 测试是否包含。 & ~ 取反,消除某些属性。
五. 位运算 判定 奇数偶数
判定 2的0次幂 是 1 还是 0 。
位运算是直接对整数在内存中的二进制位进行操作的方法。对于奇偶性判断,我们关注的是整数的最低位(即二进制的最右边一位)。在二进制中,如果一个数的最低位是0,则该数为偶数;如果最低位是1,则该数为奇数。这是因为除了最低位以外,其他位上的数字都是2的幂次方,因此它们加起来一定是偶数。最低位的1代表的是2的0次方,即1,它决定了整数的奇偶性。
//奇偶
int num2;
//std::cin >> num2;
for (num2 = 0;num2 < 100;num2++)
{
if (num2 & 0x0001)
{
std::cout << num2 << " 奇数";
}
else
{
std::cout << num2 << " 偶数";
}
}
六. 输出 2 的整数次幂。
2的幂次方数在二进制中只有一个1,其余全部是0。例如,2是10,4是100,8是1000。因此,可以利用这一特点来判断一个数是否是2的幂次方。
int time = 0;
int param = 0;
for (int num = 0; num < 1000;num++)
{
param = num;
time = 0;
while (param)
{
//time += param & 0x0001;
time += param & 0x0001; //商是奇数就加1
//std::cout << num << " \n";
param = param >> 1; //除以2的商
//std::cout << "time : " << time <<" \n";
}
if (time == 1)
{
std::cout << num << "\n";
}
}