1、隐含转换规则
如下图。。
也就是说,强制类型转换之后,表达式的值的数据类型一定与表达式中出现的的精度最高的数据形同。
代码如下:
int main() { int a = 5, b = 2; float f1 = (float)(a/b);//先计算出了整形的2,在隐式转换为2.0 float f2 = a/b; //同上,只输出2.0 float f3 = (float)a/b;//正道,先把a转换为浮点型,再计算的。 2.5 printf("%f %f %f ",f1,f2,f3); }
2、神奇的模运算%
取余运算的应用:
//判断整除。
//映射到某一个范围。(感觉这个并不常用)
//取出后 n 位。a%100得到a的后两位数字
//依次取出每个位上的数。
while(a) { printf("%d ",a%2); //打印出a的二进制数 a = a/2; }
3、对于位的运算
恰当的使用位运算可以让程序效率大大的提高,特别是涉及到底层的硬件操作的时候,会有很好的效果。
我想引用一片很好的博文来说明位的操作。
原文地址:http://blog.csdn.net/zmazon/article/details/8262185
虾米那是我的总结。有些很是方便,有些则不是很常用。
int getMaxInt()// 获取int型最大值 { return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略 } int getMinInt()// { return 1 << 31;//-2147483648 } long getMaxLong()//long型最大值 { return ((unsigned long) - 1) >> 1;//2147483647 } int mulTwo(int n) //计算n*2,常用 @@@@ { return n << 1; } int divTwo(int n) //负奇数的运算不可用 { return n >> 1;//除以2 } int mulTwoPower(int n,int m) //计算n*(2^m) { return n << m; } int divTwoPower(int n,int m)//计算n/(2^m) { return n >> m; } boolean isOddNumber(int n)//判断奇偶性 { return (n & 1) == 1; } void swap(int *a,int *b)//不用临时变量交换两个数的值 { (*a) ^= (*b) ^= (*a) ^= (*b); } int abs(int n) //取绝对值 { return (n ^ (n >> 31)) - (n >> 31); /* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1 若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算, 结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */ } int max(int a,int b) // 通用版 得到最大值 { return b & ((a-b) >> 31) | a & (~(a-b) >> 31); /*如果a>=b,(a-b)>>31为0,否则为-1*/ } int max(int x,int y)//c语言版 最大值 { return x ^ ((x ^ y) & -(x < y)); /*如果x<y x<y返回1,否则返回0, 、 与0做与运算结果为0,与-1做与运算结果不变*/ } int min(int a,int b) //最小值 { return a & ((a-b) >> 31) | b & (~(a-b) >> 31); /*如果a>=b,(a-b)>>31为0,否则为-1*/ } int min(int x,int y) { return y ^ ((x ^ y) & -(x < y)); /*如果x<y x<y返回1,否则返回0, 与0做与运算结果为0,与-1做与运算结果不变*/ } boolean isSameSign(int x, int y) //判断符号是否相同 { //有0的情况例外 return (x ^ y) >= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。 } int getFactorialofTwo(int n) { return 2 << (n-1);//2的n次方 } boolean isFactorialofTwo(int n)//判断是不是2的幂 { return n > 0 ? (n & (n - 1)) == 0 : false; /*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/ } int quyu(int m,int n) //n为2的次方 { return m & (n - 1); /*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果保留m在n范围的非0的位*/ } int getAverage(int x, int y) //计算平均值 ,绝了 { return (x + y) >> 1; } int getBit(int n, int m)//从低到高,取n 的第 m位 { return (n >> (m-1)) & 1; } int setBitToOne(int n, int m)//从低到高,将n的第m位置1 { return n | (1 << (m-1)); /*将1左移m-1位找到第m位,得到000...1...000 n在和这个数做或运算*/ } int setBitToZero(int n, int m) //从低位到高位,将n的第m位置0 { return n & ~(1 << (m-1)); /* 将1左移m-1位找到第m位,取反后变成111...0...1111 n再和这个数做与运算*/ }