关于位运算的一点点小知识

这里都是一点位运算的小知识点,没怎么详细注明这些运算过程,如果有需要就直接拿走,因为没有太多的过程解释就直接放定理结果,希望同学门见谅。(不喜勿喷)

位运算:
&:
 9&5=1
 1001
&0101
------
 0001
 
|:
 9|5=13
 1001
|0101
------
 1101
 
^:
 9^5=12
 1001
^0101
------
 1100
 
~:
 ~9=65526
~0000000000001001=1111111111110110

<<:
 9<<2=36
 1001<<2=100100

>>:
 9>>2=2
 1001>>2=10
 
 判断一个数的奇偶:
 奇数:
	x&1=1
	****************1
   &00000000000000001
------------------------
    00000000000000001
 偶数:
	y&1=0
	****************0
   &00000000000000001
------------------------
    00000000000000000

1. 使特定位翻转     要使哪几位翻转就将与其进行∧运算的该几位置为1即可。

2 与0相∧,保留原值.

3.交换两个值,不用临时变量.
我们可以在不用引入其他变量就可以实现变量值的交换

用异或操作可以实现:

      a = a^b;          //(1)
      b = a^b;          //(2)
      a = a^b;          //(3)

 
 
1 .判断int型变量a是奇数还是偶数           

a&1   = 0 偶数
a&1 =   1 奇数

2 . 取int型变量a的第k位

(k=0,1,2……sizeof(int)),即a>>k&1

3 . 将int型变量a的第k位清0,即a=a&~(1<<k)

4 . 将int型变量a的第k位置1, 即a=a|(1<<k)

5 . int型变量循环左移k次,即a=a<<k|a>>16-k   (设sizeof(int)=16)

6 . int型变量a循环右移k次,即a=a>>k|a<<16-k   (设sizeof(int)=16)

7. 整数的平均值

对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会绯龅模颐怯萌缦滤惴ǎ?/DIV>

int average(int x, int y)   //返回X,Y 的平均值
{   
     return (x&y)+((x^y)>>1);
}

8 . 判断一个整数是不是2的幂,对于一个数 x >= 0,判断他		是不是2的幂

boolean power2(int x)
{
    return ((x&(x-1))==0)&&(x!=0);
}

9 不用temp交换两个整数
void swap(int x , int y)
{
    x ^= y;
    y ^= x;
    x ^= y;
}

php:
$a ='dd';
$b = 'bb';

$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo $a,' ', $b;


10 计算绝对值
int abs( int x )
{
    int y ;
    y = x >> 31 ;
     return (x^y)-y ;        //or: (x+y)^y
}


11. 取模运算转化成位运算 (在不产生溢出的情况下)
         a % (2^n) 等价于 a & (2^n - 1)


12 乘法运算转化成位运算 (在不产生溢出的情况下)
         a * (2^n) 等价于 a<< n

13. 除法运算转化成位运算 (在不产生溢出的情况下)
         a / (2^n) 等价于 a>> n
        例: 12/8 == 12>>3

14 . a % 2 等价于 a & 1  ( a  & log2(2))      
       a % 4 等价于 a & 2  ( a  & log2(4))  

      .....       
       a % 32 等价于 a & 5


15 if (x == a) x= b;
    else x= a;
 等价于 x= a ^ b ^ x;

16 x 的 相反数 表示为 (~x+1)

功劳都是数学家的,和我没关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值