acm中的位运算:值互换,乘除2的倍数,取整,正负互换,对2的倍数取余,绝对值,相同正负,平均值,2的次方判断

1.想将a和b的值互换,可以用以下赋值语句实现:
a=a∧b;
b=b∧a;
a=a∧b;-----注意值互换时,a与b若是相同:则会置于0!!!
2.
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该
数左移时被溢出舍弃的高位中不包含1(为0)的情况。
3.
同理,右移运算符
对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。
如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
4.
转载:

  1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300%
    x = x * 2;
    x = x * 64;
    //改为:
    x = x << 1; // 2 = 21
    x = x << 6; // 64 = 26

  2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350%
    x = x / 2;
    x = x / 64;
    //改为:

x = x >> 1;// 2 = 21
x = x >> 6;// 64 = 26

  1. 数值转整数加速 10%
    x = int(1.232)
    //改为:

x = 1.232 >> 0;

  1. 交换两个数值(swap),使用 XOR 可以加速20%
    var t:int = a;
    a = b;
    b = t;
    //equals:
    a = a^b;
    b = a^b;
    a = a^b;

  2. 正负号转换,可以加速 300%
    i = -i;
    //改为
    i = ~i + 1; // NOT 写法
    //或
    i = (i ^ -1) + 1; // XOR 写法

  3. 取余数,如果除数为 2 的倍数,可利用 AND 运算加速 600%
    x = 131 % (2^n);
    //equals:
    x = 131 & (2^n - 1);

  4. 利用 AND 运算检查整数是否为 2 的倍数,可以加速 600%
    isEven = (i % 2) == 0;
    //equals:
    isEven = (i & 1) == 0;

  5. 加速 Math.abs 600% 的写法1,写法2 又比写法1加速 20%
    //写法1
    i = x < 0 ? -x : x;
    //写法2
    i = (x ^ (x >> 31)) - (x >> 31);
    //写法3
    i=x^(~(x>>31)+1)+(x>>31);

  6. 比较两数值是否拥有相同的符号,加速 35%
    eqSign = a * b > 0;
    //equals:
    eqSign = a ^ b > 0;


本文来自 Get *null 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_30076791/article/details/50571194?utm_source=copy

1.转载:
1.求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以 2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
(x&y)+((x^y)>>1);
例如:int average(int x,int y)
{
return ( (x&y) + ( (x^y)>>1 ) );
}
2. 对于一个大于0的整数,判断它是不是2的几次方
((x&(x-1))==0)&&(x!=0);
3.求绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值