位运算符&指针运算符

一、位运算符(&|^>><<~

常用到掩码(mask),操作的都是无符号的数,但是常量一般都为有符号的数,所以对于与最高位上是1的无符号常亮进行位运算时,要在前面添unsigned int以防止数据出错。

常用的位运算符

与运算(&)

0与任何数相与都为0,所以只要有0出现,相与的结果就为0。只有两个1相与才为1

应用:1清零特定位(mask中特定位置0,其它位为1s=s&mask)

      2 取某数中指定位 (mask中特定位置1,其它位为0s=s&mask)

比如输入mn(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;





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值