位运算

网上很多帖子都有关于位运算的总结,所以自己准备用自己的理解来写有关位运算的知识,还请各位指
出错误之处。 

(ps:用到的语言:C ) 


什么是位? 
简单来说,位就是1 和0 ,在电脑中做的每一件事都是由它们组成的。电脑中所有的数据使用的是位。
一个字节由8 个位组成;一个字由两个字节组成,即16个位;而一个双字由四个字节组成,即32个
位。由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快 
位运算有哪些操作符? 
&   ,|  ,~,<<,>>,^  
( 补充,逻辑运算符是 ||    ,  &&  ,   !这些和位运算符大大不同)  
它们分别的意思是: 
&   与运算符   |  或运算符  ~  取反运算符   >>   右移运算符   << 左移运算符    ^  异或运算符      
   
下面我们看看这些操作符是怎么操作的: 
& : 
1.运算规则:有0变0 ,无0 为1 
2.判断奇偶性 
a&1  = 0  偶数  
a&1 =  1  奇数 
3.可以用来取位操作 
 
 



如:一个数  and  1 的结果就是取二进制的最末位   
4.判断一个数的二进制第n 位是否为1 的方法是:把一个n 位为1 ,其它位为0 与待判断的数进行与运算 
我们看下例子(看是否存在D 盘,主要是根据与运算是否存在1000): 
5.求余优化(x%(2n)=x&(2n - 1)) 
| : 
1.运算规则:有1变1 ,无1 变0 
2.一个数or 1的结果就是把二进制最末位强行变成1  
~: 
1.取反运算的定义是把内存中的0 和1 全部取反。使用not 运算时要格外小心,你需要注意整数类型有没有符号。如果not的对象
是无符号整数(不能表示负数)。 
如: 
   
如上面的一段程序 算出来为  65435   而它的上界位65536 所以算出来的结果是它们的差,因为无符号类型的数是用$0000到$
FFFF依次表示的。 
<<:(左移) 
1.如A<<B:是A 转换为二进制后向左移动B 位 
2.左移3 相当于乘以2 的3 次方 
可以使用(1 << 16 )-1 来表示个常量 如# defien Max_N (1 << 16 ) - 1,  因为这个值表示65535(很有用,有时大量的乘除
运算可用移位代替,效率会很高!) 
>>:(右移) 
1.A>>B:是A 转换为二进制后向右移动B 位 
2.右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0 ,若为负数,可能补0 或补1 ,这取决于所用的计算机系统。 
Code:  
1. DWORD  d = GetLogicalDrives();      
2.              if((d&8)>0) //是否存在D 盘       
3.             {      
4.                  SetDlgItemText(hwnd,IDC_EDTNAME4,TEXT( " 存在D盘" ));        
5.             }      
6.              else     
7.             {      
8.                 SetDlgItemText(hwnd,IDC_EDTNAME4,TEXT( " 不存在D 盘" ));            
9.             }     
 
Code:  
1. #include <stdio.h>        
2. int  main(void)       
3. {     
4.     unsigned short  a=100;     
5.     a = ~a;       
6.     printf(  "%d\n", a );           
7.     return 0;     
8. }      



3.右移3 相当于除以2 的3 次方 
下面是个例子,看电脑中存在多少磁盘(主要是右移!) 
 ^:(异或)  
1.可以用一句话理解:是不是不一样 (不一样为1 ,一样为0 ) 
2.两次异或同一个数还是它本身(如:( a ^b)^b=a ) 
3.(a ^ b) ^ b = a,像这种异或运算可用于加密 用两次异或 b 位密码   

4.另外还有一个是不引入第三变量,交换两个变量的值  (设  a=a1,b=b1) ->


5.两个二进制数异或的结果为两者之差的绝对值 
    
一些位运算的例子: 
  用位运算求绝对值: 
   x  >> 31 是二进制的最高位,它用来表示x 的符号。如果它为0(x 为正),则~ (x >> 31) +  1 等于$ 00000000,异或任何
数结果都不变;如果最高位为1 (x 为负),则~ (x >> 31) +  1 等于$ FFFFFFFF ,x 异或它相当于所有数位取反,异或完后再
加一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值