一、位运算符(&、|、^、>>、<<、~)
常用到掩码(mask),操作的都是无符号的数,但是常量一般都为有符号的数,所以对于与最高位上是1的无符号常亮进行位运算时,要在前面添unsigned int以防止数据出错。
常用的位运算符
与运算(&)
0与任何数相与都为0,所以只要有0出现,相与的结果就为0。只有两个1相与才为1。
应用:1清零特定位(mask中特定位置0,其它位为1,s=s&mask)
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
比如输入m,n(m<n),要求m,n之间置为1,可设置掩码为:Unsigned int mask = (unsigned int )((~0) >> (32 - (n - m -1)) << m)
先取全为1,假设m,n的位置如图所示,:m在第8位,n在第15位,m,n之间有8位,为(n-m-1),向右移动32-(n-m-1)就变为第二列的样子,在向左移动m个,就满足了题目中的要求。
N M
↓ ↓
1111 1111 1111 1111 1111 1111 1111 1111
0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 1111 1111 0000 0000
方法二:直接给MASK赋值2^(m+1)-2^n.
或运算(|):有1相或的结果就为1,常用于将某些位置置1.
异或(^):可用于不设置中间变量交换两个值,
如a = a^b;
b = a^b;
a = a^b;
用一个口诀可以轻松记住应用
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
左移&右移:左移用0补,右移用符号位补。右移相当于除2,左移相当于乘2,但是效率比乘除法高。
二、指针运算符(* &)
指针是一个变量,即内存会给他分配一个地址,指针里保存的是地址。
如:
int num = 5;
char *p = &num;
等式:
P = &num ;对应的内存空间
*p = num = *(&num)指向的内存空间
int **p = &p;
等式:
P= &num = *pp;
Num = *p = **pp;
字符指针:用字符串的首地址来表示字符串的地址
野指针:随机指定内存中的一块内存,会导致内存泄露。
原因:指针变量没有被初始化,指向的是一块已一经释放的内存,或者是一块没有访问权限的内存。
如何避免野指针:
1)初始化:方法一:char * p = (char * )malloc(sizeof(char));
方法二:char * p = NULL;
2)使用完指针后务必记得需要用free(p)释放指针所指向的内存,释放完内存后另指针的值变为NULL!如下:
free(p);
p = NULL;