目录
1. 两个数不同的二进制位个数
2.原码、反码、补码
3.不创建临时变量实现两个数的交换
4.求一个整数存储在内存中的二进制中1的个数
5. 特例-1
6.将指定的位置置1
7.将指定位置置1
8.++a与a++
9.||与&&
10.逗号表达式
11.srand与rand
12.sizeof
13.结构体初始化
14.枚举初始化与赋值
1. 两个数不同的二进制位个数
#include<stdio.h>
int main()
{int a = 2022;int b = 1028;int c = a ^ b;int count = 0;while (c){c = c & (c - 1);count++;}printf("%d\n", count);return 0;
}
2.原码、反码、补码
int main()
{/*首先写出两个数的补码,再按位与,再求出它的原码,按规定打印出来*/int a = 3;int b = -5;//00000000 00000000 00000000 00000011 -- 原码、反码、补码一样//10000000 00000000 00000000 00000101 -- 原码//11111111 11111111 11111111 11111010 -- 取反//11111111 11111111 11111111 11111011 -- 加1得补码//00000000 00000000 00000000 00000011 -- 3和-5的补码按位相与int c = a & b;printf("%d\n", c);//相与的结果以%d的形式打印,即打印一个有符号的整数//我们求出的是3和-5的补码按位与的结果存在了c里面//但我们需要打印它的原码//而c最高位是0,是正数,原码补码反码都一样,故打印3return 0;
}
首先写出两个数的补码,再按位与,再求出它的原码,按规定打印出来
printf("%d\n", c);//相与的结果以%d的形式打印,即打印一个有符号的整数
//我们求出的是3和-5的补码按位与的结果存在了c里面
//但我们需要打印它的原码
//而c最高位是0,是正数,原码补码反码都一样,故打印3
3.不创建临时变量实现两个数的交换
容易溢出:
int a = 3;//0000 0011int b = 5;//0000 0101a = a + b;//a = 8b = a - b;//b = 3a = a - b;//a = 5
采用异或:
0^a = a;相同为0,不同为10000 0000 0000 00000000 0101 0111 1011 -- a0000 0101 0111 1011 -- a/*本来是0的还是0,本来是1的还是1*/a^a = 0;相同为0那么a^a^b = b异或支持交换律a^(a^b) = bb^(a^b) = a那么b^b^a = a0000 0110 -- a = a^b0000 0101 -- b 0000 0011 -- b = b^a0000 0110 -- a0000 0101 -- a = a^ba = a ^ b;//a = 3^5b = b ^ a;//b = 5^3^5 = 3a = a ^ b;//a = 3^5^3 = 5
4.求一个整数存储在内存中的二进制中1的个数
int a = 31;int i = 0;int count = 0;for (i = 0; i < 32; i++){if (((a >> i) & 1) == 1){count++;}}printf("%d\n", count);
5. 特例-1
int b = 0;printf("%d\n", ~b);//-1
规定了1111 1111 1111 1111 11111 1111 1111 1111为-1
6.将指定的位置置1
//改变任意位int a = 5;//0000 0101//0000 0010//0000 0111 -- 7a |= (1 << 1);
以改变第1位为例:
因为按位或,又一个规律,1|x = 1;0|x = x,那么与1相或如果是1还是1,如果是0还是1
7.将指定位置置1
a &= ~(1 << 1);
8.++a与a++
int main(){int c = 3;int d = c++;printf("%d %d\n", c, d);int m = 5;int n = ++m;printf("%d %d\n", m, n);int x = 10;printf("%d", x--);//先打印再--printf("\n");printf("%d", x);/*printf("\n");printf("%d", --x);*/return 0;}
int x = 10;printf("%d", x--);//先打印再--printf("\n");printf("%d", x);
9.||与&&
int i = 0, a = 1, b = 2, c = 3, d = 4;i = a++ || ++b || d++;因为a = 1先赋值给i,a = 1为真,故不会对b和d进行计算还是原本的值之后a进行自增,故打印的是2234printf("%d\n", i);printf("%d %d %d %d", a, b, c, d);int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++ || ++b || d++;0为假,故会计算b,b先自增变成3为真,后面不计算int j = (a++ || ++b || d++);printf("%d\n", i);//1printf(" %d\n", j);//1printf("%d %d %d %d", a, b, c, d);//1334
10.逗号表达式
逗号表达式,整个表达式的结果是最后一个表达式的结果
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d\n", c);//13
printf("%d %d\n", a ,b);
}
11.srand与rand
#include<stdlib.h>
#include<time.h>int main()
{int i = 10;int j = 0;/*不加这句话每次都是打印相同的随机数*///srand((unsigned int)time(NULL));while (i--){j = (int)rand();printf("%d\n", j);}return 0;
}
12.sizeof
13.结构体初始化
typedef struct student {int grade;char name[10];int telenum[12];char age;char sex[10];}student;int main(){student Stu = { 1, };//这种初始化就是让第一个成员变量特殊赋值return 0;}
14.枚举初始化与赋值
#define voice_max 100
typedef enum { DG, DN, UDG = 10, UDN } test; 注意test就是我这里给这个枚举类型自定义的一个新的类型名,类似与int,float等。
int main()
{//注意test就是我这里给这个枚举类型自定义的一个新的类型名,类似与int,float等。test b;//b = 2 // 注意此处虽然是对枚举变量赋值,赋的范围虽然也在枚举值范围内,但这是错的,因为你不能用数字直接对其进行赋值。 // b = (test)2; // 这样就可以了,加一个枚举类型的强制转换即可。//test b;b = UDG; //b是一个枚举变量,而UDG是一个枚举值常量,这样赋值就是正确的printf("%d", b);printf("%d", b);return 0;
}