#includeintmain(){int a =4;//4的补码:00000000000000000000000000000100int b =-7;//-7的补码:11111111111111111111111111111001int c = a & b;//c的补码:00000000000000000000000000000000printf("%d\n",c);//c = 0return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
#includeintmain(){int a =4;//4的补码:00000000000000000000000000000100int b =-7;//-7的补码:11111111111111111111111111111001int c = a | b;//c的补码:11111111111111111111111111111101printf("%d\n",c);//-3return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1
2
3
4
5
6
7
8
9
10
11
12
5.3按位异或(^)
按位异或(^)规则:使用补码进行按位异或,相同为0,相异为1。 以下面代码为例:
#includeintmain(){int a =4;//4的补码:00000000000000000000000000000100int b =-7;//-7的补码:11111111111111111111111111111001int c = a ^ b;//c的补码:11111111111111111111111111111101printf("%d\n",c);//-3return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1
2
3
4
5
6
7
8
9
10
11
12
异或运算的一些特殊场景: a ^ a = 0; a ^ 0 = a; 3 ^ 3 ^ 5 = 5 = 3 ^ 5 ^ 3
5.4按位取反(~)
按位取反(~)规则:使用补码进行按位取反,全部取反即可。 以下面代码为例:
#includeintmain(){int a =0;//a的补码:00000000000000000000000000000000int b =~ a;//b的补码:11111111111111111111111111111111printf("%d\n",b);//-1return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
#includeintmain(){int a =3;//3的补码:00000000000000000000000000000011int b =5;//5的补码:00000000000000000000000000000101printf("交换前: a = %d b = %d\n",a,b);
a = a ^ b;//此时a的补码:00000000000000000000000000000110//即此时a = 6
b = a ^ b;//b = a ^ b ^ b = a//此时b的补码:00000000000000000000000000000011//即此时b = 3
a = a ^ b;//a = a ^ b ^ a = b//此时a的补码:00000000000000000000000000000101//即此时a = 5printf("交换后: a = %d b = %d\n",a,b);return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行结果如下图: 这里运用了b = a ^ b ^ b = a和a = a ^ b ^ a = b的按位异或运算,解决了两个数不创建新的变量交换的问题。
#includeintmain(){int num =-1;int i =0;int count =0;//计数while(num){
count++;
num = num &(num-1);}printf("二进制中1的个数 = %d\n",count);return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
#includeintmain(){int n =13;//13的补码:00000000000000000000000000001101//将n的第 5位改成 1
n = n |(1<<4);//左移后:00000000000000000000000000010000//按位或后:00000000000000000000000000011101printf("%d\n",n);//29
n = n &(~(1<<4));//左移后:00000000000000000000000000010000//按位取反后:11111111111111111111111111101111//按位与后:00000000000000000000000000001101//将n的第 5位改为 0printf("%d\n",n);//13return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
int a =1;int b =2;int c =(a > b, a = b +10, a, b = a +1);//逗号表达式,c = 13
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1
2
3
八、下标访问[ ]、函数调用( )
[ ] —— 下标引用操作符 () —— 函数调用操作符
8.1[ ]下标引用操作符
操作数:一个数组名 + 一个索引值(下标)
int arr[10];//创建数组 arr[7] = 8;//实用下标引用操作符。 这里的两个操作数为:arr和7。
评论记录:
回复评论: