运行环境:
win10
codeBlocks 17.12版本
1:sizeof(给出一个数据类型或者数据对象的字节数)
sizeof表达式有两种形式:
-> sizeof(类型名)
-> sizeof 表达式 。也可以写成sizeof(表达式)
sizeof的返回值为size_t类型,在头文件stddef.h中size_t定义为unsigned。
int a,b; b = 3; printf("%u",sizeof a *b);//程序输出不为4,而是12.
->由于sizeof的返回类型为unsigned,所以使用%u。
->由于sizeof a 得到unsigned类型的4,在和b(=3)相乘得到12(unsigned类型)。
2: 逗号运算符
表达式1,表达式2
整个表达式的值和类型与表达式2的值和类型一致。
x=(i=4,i%3); //x=1,i=4。先执行了i=4,再执行i%3,整个(i=4,i%3)的值为1.
x=i=4,i%3; //先执行x=i=4,再执行i%3。整个表达式的值为1,x=i=4。
3:位运算有趣例题1
可以把21世纪日期的日月年三个整数压缩成一个16位的整数。写一个表达式,实现压缩存储日月年。
分析:
21世纪的年份,自然只需要后两位即可表示,日期不超过31,月份不超过十二,于是,对应着,各需要5位,4,位,5位来表示。
因此表达式如下:day<<11 | month<<7 | year
4: 位运算有趣例题2
简单加密示例。将一个短整型数x从高位向低分分别分成4个长度不等的部分,A(3位),B(5位),C(4位),D(4位)。
然后将它们按照CADB排列,重新拼凑在一起。
解答:
我的思路如下:通过构造一个全1的16位short,然后使用移位从x中“切出”ABCD。
short x,a,b,c,d,max; max= (short)pow(2,16)-1; cin>>x; a = max<<13 & x; b = (max<<11)>>3 & x; c = (max<<12)>>8 & x; d = max>>12 & x;
这个思路没问题,只是实现方式太蠢。
其实可以直接通过使用十六进制的数来得到如上的acd。
a = x & 0xE000;//此处注意0xE000是int类型,于是x & 0xE000自动转换成int类型,然后强制截断,赋值给a。 b = x & 0x1F00; c = x & 0xF0; d = x & 0xF;
5:编写一个程序,读入一个字符,计算其奇偶校验位,并将其最高位设置为奇偶校验位。
解答:
我的做法如下:(采用偶校验:即偶数个1,上0,奇数个1,上1)
char c; int sum; cin>>c; sum=0; for(int i=0;i<7;i++){//循环七次,依次取出各位,把各位加到sum上,再根据sum的奇偶性来判断第八位该上1还是上0。 sum += (c>>i & 1); cout<<(c>>i & 1)<<endl; } cout<<(sum%2<<7 | c)<<endl;
tips:
-> for(int i=0,sum=0;i<7;i++),如果写成这样,那相当于在for这个块内,又创立了一个同名sum。需要特别注意。
教材上给的例子如下:
unsigned char data,backup,t; int parity=0; data=getchar(); backup =data; while(data){ t = data & 1; parity ^=t; data>>=1; }
6: 打印整数各个二进制位。
void PrintBit(int x){ int length = sizeof(x) * CHAR_BIT;//CHAR_BIT 包含在limits.h中。 int mask = 1<<(length-1); for(int i =0;i<length;i++){ putchar(x & mask ? '1':'0'); x<<=1;
if(!((i+1) % CHAR_BIT ) && i <length) printf(" "); //每八位分隔一下
}
}
tips:
我把这段代码拷贝入codeBlocks时,出现如下错误:
原因不明。总之我把出现红点的那行的空白字符都删掉,再重新按照舒服的方式用空白字符隔开的时候,报错消失了。
7:long long 类型(C99)
长度至少64位,也分有无符号两种,即unsigned long long 和 long long 。
后缀使用LL或者ll。
标准c规定在printf中输出long long得使用%lld,在codeBlocks 17.12版本中也支持这样。
8: C99引入的真正的布尔类型_Bool。
具体内容可以看https://blog.csdn.net/daheiantian/article/details/6241893
9:putchar
原型为:int putchar(int c);
把c转换为unsigned char类型,再送入标准输出设备中去。
如果函数正确执行,则返回所输出的字符的字符码,否则返回EOF。
int b = putchar('a'); printf(" %d",b);
输出结果为:a 97
10:EOF
一般来说EOF定义为-1,但有的不是,所以为了代码的可移植性,需要使用EOF时,不要使用-1,而要使用EOF。
11:getchar
原型为 int getchar(void)
正确输入后,把输入字符转换为int类型后,作为函数的返回。
12:puts
原型为 int puts(const char * s)
-> s以 作为字符串结束标志。
-> puts正确执行时,返回一个非负整数值,否则返回EOF。
13:gets(c11被删除)
原型为 char * gets(char *s)
-> 读取一行输入,会自动把 替换为 作为结束符。
-> 如果一行输入中包含空格的字符串,必须使用gets。
-> 由于该函数隐含了编译器无法判断的安全隐患,c11里面删除了该函数,但在之前的编译器版本中还可以使用。
14:%f %g %e(printf格式化的输出)
%f:输出小数形式的浮点数,小数部分六位数,多于六位,四舍五入,少于六位,则在末尾补零,保证刚好六位。
%e: 输出标准形式的浮点数,尾数部分为六个有效数字,包括一个非零的整数部分以及五个小数部分。同样采用四舍五入和末尾补零的办法确保六个有效数字。
%g: https://blog.csdn.net/Qsir/article/details/77930367
15: if else
执行内层配对原则,即else与隔它最近的还没有配对的if配对。