概念
与运算,&
3 & 5 = 1
3 的二进制表示为 0011
5 的二进制表示为 0101
& 的运算规则:(同真为真)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
因此,3 & 5 = 0011 & 0101 = 0001 = 1
或运算,|
3 | 5 = 7
3 的二进制表示为 0011
5 的二进制表示为 0101
| 的运算规则:(逢真为真)
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
因此,3 | 5 = 0011 | 0101 = 0111 = 7
异或运算,^
3 ^ 5 = 6
3 的二进制表示为 0011
5 的二进制表示为 0101
^ 的运算规则:(相同为0,相异位1)
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
因此,3 ^ 5 = 0011 ^ 0101 = 0110 = 6
取反运算,~
~3 = -4
3 的二进制表示为 0011
~ 的运算规则:
~0 = -1
~1 = -2
~2 = -3
~3 = -4
因此,~3 = 1100 = -4
左移运算,<<
右移运算,>>
>> :右移,正数右移,高位补0,负数右移,高位补1
>>>:右移,高位补0,不区分正数负数
<<:左移,低位补0,不区分正数负数
除法运算转成位运算:n>>k 等价于 n/(2^k) 右移一位相当于除以2。 比如 9/4=2 n=9,4=2^2 所以k=2,即右移2位。用9>>2可以实现。
代码
求一个整数存储在内存中的二进制位有多少个1
#include<stdio.h>
//int main(){
// int a=5;
// int b=3;
// a=a+b;
// b=a-b;
// a=a-b;
// printf("a=%d\n",a);
// printf("b=%d\n",b);
//
//}
//int main(){
// int a=5;
// int b=3;
// a=a^b;
// b=a^b;
// a=a^b;
// printf("a=%d\n",a);
// printf("b=%d\n",b);
//
//}
//求一个整数存储在内存中的二进制位有多少个1
int main(){
int a=7;
int flag=32;
int count=0;
while(flag){
if(a&1==1)
count++;
a=a>>1;
flag--;
}
printf("%d",count);
}
修改一个整数的二进制位的某位数
//修改一个整数的二进制位的某位数
int main(){
//00000000000000000000000000001101
int a=13;
//将倒数第五位的0变为1
//00000000000000000000000000000001 1
//00000000000000000000000000010000 1<<4
a|=(1<<4);//4=x-1;
//00000000000000000000000000011101
printf("a=%d\n",a);//29
//将倒数第五位的1变为0
//00000000000000000000000000000001 1
//00000000000000000000000000010000 1<<4
//11111111111111111111111111101111~取反
a&=(~(1<<4));//4=x-1;
//00000000000000000000000000001101
printf("a=%d\n",a);//13
}
结构体
struct Stu{
char name[20];
int age;
double score;
};
// (*stu).age相当于stu->age
void set_stu(struct Stu* stu){
//赋值得传指针
strcpy(stu->name,"zhangsan");
stu->age=20;
stu->score=100.0;
// (*stu).age=20;
// (*stu).score=100.0;
// strcpy((*stu).name,"zhangsan");
}
void print_stu(struct Stu stu){
printf("我的姓名是%s 今年%d岁了 成绩是%lf分\n",stu.name,stu.age,stu.score);
}
int main(){
struct Stu stu={0};
set_stu(&stu);
print_stu(stu);
}