&(位与) |(位或) ^(异或) ~(位反)
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;
}