首页 > 代码库 > 1.5第三天

1.5第三天

下午好多干货啊~

之前意识到编码能力很弱,今天接着发现知识储备也不好╮(╯▽╰)╭

 

指针(pointer)的涵义不完全都是指针变量,有时也指地址

 

函数名: pow
功 能: 指数函数(x的y次方)
用 法: double pow(double x, double y); 

 

以0x开始的数据表示16进制
    %x, %X      无符号以十六进制表示的整数

    %0              无符号以八进制表示的整数

感受下负数(补码表示)的移位,-9:ffff fff7  -18:ffff ffee 

展开二进制正是补码左移一位的效果。左移补0,右移补一

 

0异或任何数等于任何数本身
1异或任何数等于任何数取反

a^b=b^a(交换律)    a^b^c=a^(b^c)=(a^b)^c(结合律)    a^b^a=a^a^b=b

实现两个数的交换而不使用临时变量,如两个数为a=5(0101),b=7(0111),		//a=a^b,b=b^a,a=a^b  =>a=7,b=5

while(fflush(stdin),exp1)
先执行清空,再判断是否进行循环


sizeof(...)是运算符 strlen(...)是函数,要在运行时才能计算。strlen只关心存储的数据内容,不关心空间的大小和类型。
sizeof可以用类型做参数,strlen只能用char*做参数
char str[20]="0123456789"; 
int a=strlen(str); //a=10; 
int b=sizeof(str); //而b=20;
strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。 
求两个只出现了一次的数

方法一:假设二个不同数值是a,b;那么 s = a^b; 然后求的s中第一次出现1的位置k,根据异或运算特性,第一次出现1的地方就是这二个数位有区别的地方,比如1001 0101 与 1100 0001 得到异或结果是0101 0100 .那么第一次出现1的地方是第三位,a的第三位是1而b是0 。 接着遍历数值,找出第三位是1的数值就异或,得到的结果就是其中一个数与其他出现二次的数求异或,因为出现二次的数异或得到为0所有最后结果就是所求其中一个数。
最后s与该数求异或就得到另一个数。
方法二:“只有两个数出现一次”的情况:可以找到一种方法,将数组划分为两部分,且让这两个数分别在不同部分,这样每部分所有数的异或值,恰好分别等于这两个数。根据 +k位是否为1,将原数组分为两部分。

交换两个数:
法1.用个temp
 
 reight = left - right;.........(相册有)
 
***************************未解决******************************
三个只出现了一次的数:
http://www.cppblog.com/flyinghearts/archive/2013/03/21/198695.html

法2.left = left + right;
     right = left - right = (left + right )- right = left;
     left = left - right = (left + right) - left = right;

1.5第三天