位操作

1、位操作求两个数的平均值
若用(x+y)/2求两个数的平均值,当两个数比较大时,用这种方法可能会存在数据溢出的情况,采用位运算方法可避免这一问题。
(x&y)+((x^y)>>1) 即是用位运算求解两数的平均值

2、用位运算计算数的绝对值

int MyAbs(int x)
{
      int y;
      y=x>>31;
      return (x^y)-y; //此处也可写成(x+y)^y
}

对于一个负数,将其右移31位后会变成0xffffffff,而对于一个正数而言,右移31位是0x00000000。在计算机中,数字都是以补码的形式存放的。

3、如何求解整型数的二进制表示中1的个数

int Func(int x)
{
      int countx=0;
      while(x)
      {
         countx++;
         x=x&(x-1);//去掉整数x二进制中的最后一个1
      }
      return countx;
}



int Func2(unsigned int x)
{
     int count=0;
     while(x)
     {
         count+=x&0x1u;
         x>>=1;        //此法在1比较稀疏的时候效率比较低
      }
      return count;
}

4、不能用sizeof()函数时如何判断操作系统是16位还是32位?

#include<stdio.h>
int main()
{
      int i=65536;
      printf("%d\n",i);
      return 0;
}
//16位机器下,无法输出那么大的数,会输出0(出现越界现象),32位机器可正常显示



#include<stdio.h>
int main()
{
      unsigned int a=~0;
      if(a>65536)
          printf("32位\n");
      else
          printf("16位\n");
      return 0;
}
//对0取反,不同位数下结果不同

5、嵌入式编程中,什么大端/小端?
采用小端模式的CPU对操作数的存放方式是从低字节到高字节,而采用大端模式的CPU对操作数的存放方式是从高字节到低字节。
如果能通过代码知道CPU对内存采用小端还是大端模式读写,一定会令面试官刮目相看。

int checkCPU()
{
      unsigned short usData=0x1122;
      unsigned char* pucData=(unsigned char*)&usData;
      return(*pucData==0x22);//返回ture代表是小端模式
}

6、考虑n位二进制数,有多少个数中不存在两个相邻的1
假设所求结果为a(n),则当第n位为0时,个数为a(n-1),第n位为1时,个数为a(n-2),则所求结果a(n)=a(n-1)+a(n-2),满足斐波那契数列,可由递归方法求出:

long Fibo(int i)
{
   if((i==1)||(i==2))
        return 1;
   else 
        return(Fibo(i-1)+Fibo(i-2));
}

7、一些关于位运算的知识
(1)-n=~(n-1)=~n+1;
(2)n&(-n) 或 n&~(n-1);获取整数n的二进制中的最后一个1
(3)n&(n-1);去掉整数n的二进制中的最后一个n

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值