C/C++ 位运算小算法练习

一.如何使用

>>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";
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值