位操作
来源:互联网 发布:什么是泛型编程 编辑:程序博客网 时间:2024/06/06 18:26
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
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- sql注入——资源记录
- Post-Mortem Debugging Your Application with Minidumps and Visual Studio .NET
- 电子或通信领域当前的主流技术及社会需求调查报告
- Remove Duplicates from Sorted List
- 初识RMAN4 : RMAN压缩、加密备份,shell中调用RMAN备份
- 位操作
- 2.运行你的App-Google官网上的Android初学训练
- Android自定义TextView省略号样式
- Arduino 平台与C语言程序设计-week3-Arduino Programs-Lesson2
- css3-transition
- JAVA自学日记2--单例设计模式
- 图形显示之RGB
- 深入类加载器
- UVa-10763 交流生