3.位运算

&(位与) |(位或) ^(异或) ~(位反)

char;short;int;long int;longlong;
不可进行位运算
float;double;long double;pointer(指针)

~(位反)
c = ~a;
//a = 0000 0000;
//c = 1111 1111;

^(异或)
c = a ^ b;
c = a ^ a;//c = >0000 0000(将该数置为零)

|(位或)
c = a || b;
c = a | b;

&(位与)
c = a && b; //逻辑与 简洁与//false,0,’\0’;NULL;
//c = false; true; // 0, 1

	c = a & b;       //位于
	//a = 0000 1100 //
	//b = 0001 1011 //
	//c = 0000 1000//

int main()
{
	char a = 12;
	char b = 27;
	char c = 0;

	if ((a > 10) && ++b)
	{
	}
	printf("%d\n", b);

	if ((a > 10) & ++b)
	{
	}
	printf("%d\n", b);
	return 0;
}
int main()  //右移
{
	char a = 103;                  //a => 0110 0111

	a = a >> 1;                   //      0011 0011  //51
	printf("%d", a);
	a = a >> 1;                   //      0001 1001
	printf("%d", a);
	a = a >> 1;                   //      0000 1100
	printf("%d", a);
	a = a >> 1;
	printf("%d", a);
	a = a >> 1;
	printf("%d", a);
	a = a >> 1;
	printf("%d", a);
	a = a >> 1;
	printf("%d", a);
	a = a >> 1;
	printf("%d", a);
	a = a >> 1;
	printf("%d", a);
	a = a >> 1;
	printf("%d", a);
	
	return 0;

}
int main()    //左移 在末尾加零 高位零舍去
{
	char a = 9;                            //a => 0000 1001  //9

	a = a << 1;  // a <<=1;                // 0   0001 0010  //18
	printf("%d \n", a);
	a = a << 1;  // a <<=1;                //     0010 0100  //
	printf("%d \n", a);
	a = a << 1;  // a <<=1;
	printf("%d \n", a);
	a = a << 1;  // a <<=1;
	printf("%d \n", a);
	a = a << 1;  // a <<=1;
	printf("%d \n", a);
	a = a << 1;  // a <<=1;
	printf("%d \n", a);
	a = a << 1;  // a <<=1;
	printf("%d \n", a);
	a = a << 1;  // a <<=1;
	printf("%d \n", a);
	a = a << 1;  // a <<=1;
	printf("%d \n", a);

	return 0;
}

eg:

int main()
{
     const char *str = "yhping";
     char ch = str[2];     //*(str+2)
     char cch = "yhping"[2];
     sizeof("yhping");    //7
}

(1)

int GetX1Bit(int x)
{
	int sum = 0;
	while (x != 0)
	{
		if (x & 0x01) //00000000000000000000000000000001
		{
			sum += 1;  // 1  1
		}
		x = x >> 1;
	}
	return sum;
}
int main()
{
	int x = 0;
	scanf_s("%d", &x);  //x = 7 // x = 255
	int num = GetX1Bit(x);
	printf("%d \n", num);
	return 0;
}

(2)

int GetX1Bit(int x)
{
	int sum = 0;
	while (x != 0)
	{
		if (x & 0x01) //00000000 00000000 00000000 00000001
		{
			sum += 1;  // 1  1
			x = x & (x - 1);
		}
	}
	return sum;
}

(3) !!!!!最佳 查表法

int digit[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
int GetX1Bit(int x)
{
	int sum = 0;
	for(int i = 0;i <8; ++i)
	{
		sum += "\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[x & 0x0f];   //通过转义字符‘\’转义为数值(0~255)
		x = x >> 4;
	}
	return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值