位运算
来源:互联网 发布:vim c语言 ide 编辑:程序博客网 时间:2024/05/29 15:46
位运算:
对整数在内存中的二进制位进行操作。一般操作如下:
操作数的存放方式也分为大端模式,小端模式;大端模式:从高字节到低字节。小端模式:从低字节到高字节。
例如0x1234的存放方式:
小端:内存地址存放内容0x40000x340x40010x12大端:
内存地址存放内容0x40000x120x40010x34
判断存放方式是大端还是小端模式:
void checkCpu(){ unsigned short data = 0x1122; unsigned char *p = (unsigned char *)&data; if(*p==0x22) 小端 else 大端}
介绍2个位运算的等式:
-n = ~(n-1)=-n+1;
获取二进制位的最后一个1:n&(-n);
去掉二进制位的最后一个1:n&(n-1);
位运算实现平均数(防止大数相加之后的溢出情况):
int anverage(int x,int y){ return (x&y)+((x^y)>>1);}
位运算实现绝对值:
int abs(int x){ //负数右移31位 变成0xffffffff 正数则为:0x00000000 int y; y = x>>31; return (x^y)-y;}
int add(int num1,int num2){ /** 二进制加法:0+0=0;0+1=1;1+0=1;1+1=0进位是1; 所以类似于异或操作,只有进位的时候选择的x&y 1&1=1,0&0=0不存在进位 */ int tmp,carry; if(num2 == 0) return num1; tmp = num1^num2; carry = (num1&num2)<<1; return add(tmp,carry);}
位运算实现乘法:
int multi(int a,int b){ /** 分析 乘法同时也是加法的一种变形 1011*1010 = 1011*1000+1011*0010; 好比1011<<3 + 1011<<1; 通过上面的tips:获取1:n&(-n) 去掉1:n&(n-1) 通过map<int,int>存储数值 和位数 */ bool flag = (b<0); if(b<0) b = -b; if(a==0 || b==0) return 0; map<int,int> bit_map; int i; int sum=0; for(i=0;i<32;i++) bit_map.insert(1<<i,i); while(b>0){ int last_one = bit_map[b&(-b)]; sum += a<<(last_one); b &= (b-1); } if(flag) return -sum; else return sum;}
位运算实现除法:
int div(const int x,const int y){ int left_num = x; int ans = 0; while(left_num>=y){ int mul = 1; while(y*mul <=(left_num)>>1) mul <<= 1; ans += mul; left_num -= y*mul; } return ans;}
0 0
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 连续触发onmouseover|onmouseout
- 【URAL】1057 Amount of Degrees 数位DP
- 静态化调用和实例化调用的区别
- 提高matlab运行速度的心得
- 快速搞定Eclipse的语法高亮
- 位运算
- javascript基础知识梳理-原始类型 .
- 2014年10月31日
- cxSpreadBook 或 cxSpreadSheet 设置成文本格式
- poj 1157 LITTLE SHOP OF FLOWERS(DP)
- SVA(system verilog assertions)基础
- AxureRP介绍–常用原型设计工具对比
- oracle 锁表、解锁的语句
- Openfire配置数据库的问题记录