不可小视的位运算

2014-11-24 07:14:34 · 作者: · 浏览: 0
1.判断是否是2^n
!(x&(x-1))

2.求两个数的平均值
(x&y)+((x^y)>>1)


3.统计一个数(转化为二进制后)包含1的个数
  while(x)
    {
        cout++;
        x=x&(x-1);
    }


4.比较两个数的大小
	int c = a-b;
	char* strs[2]={"a 大","b 大"};
	c = unsigned(c)>>(sizeof(int)*8 - 1);//1B=8b
	//把结果转化为无符号型,如果结果是负数,那么第32位
	//也就是有符号数的符号位为1,反之为0.所以,可以右移
	//31位把符号位取出来,用作结果数组的下标。
	cout<
  
   

5.交换a,b的值,不使用任何中间变量


(1)一般的做法
	int a = 0x7ffffffe;
   	int b = 0x7fffffff;
	cout<<"a="<
    
     int a = 0x7ffffffe;
int b = 0x7fffffff;
cout<<"a="<
      
        
      
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)