让人头大的位运算

 

1.定义:位运算通常是指对二进制数的运算。常见的位运算符有

 (1)& 按位与      全一则一

 (2)| 按位或        有一则一

(3)^按位异或     相同位上不一样则为1

  (4)  ~取反,将0变成1,将1变成0.

(3)<<  左移  M<<1是将M转化成2进制数,向左移动一位  丢弃高位,低位补零

         左移就相当于乘以2的n次方。

          eg: 将十进制3左移4位,则有: 3<<4就等于将0000 0011左移4位。即0011  0000

 (4)>> 右 移    M<<1是将M转化成2进制数    向右移动一位.

         右移就相当于除以2的n次方。  丢弃低位,高位补符号位

          对于有符号数时,在右移时,符号位将跟随移动。当为正数时,最高位补0;当为负数时,符号位补1.

           eg:  将15右移两位,即0000 1111>>2,则有 0000 0011

2.按位运算规则

       (1) 将第K位变1:

                 按位或 1。因为0和任何数字按位或都不变,1和任何数字按位或都为1.

                  eg:

                                                

        (2)将第k位变成0:

                    按位与0。因为0和任何数字按位与都变0,1和任何数字按位与都不变

                   eg:

                    

         (3)将第k位取反:

                    按位异或 .因为0和任何数字按位异或都不变,1和任何数字按位异或都取反

                        

         总规则:         1.确定符号            2.确定数字          3.构造数字

 

       3.有关位运算的算法(一字节)

       1.将ch的 二进制右数第n位置 1(n从1开始)             

int GetBits( char *ch,int n)//0101 0010->0101 0110
  {
   if(n<1||n>8)
   {
       return false;
  }
    *ch|=1<<(n-1);
      return ture;
} 

           2.获取ch的 二进制右数第n位置 的值(n从1开始)          

               

 int GetBits( char ch,int n)
  {
   if(n<1||n>8)
   {
       return false;
  }
   return (ch>>(n-1))&1);
      
} 

3.将ch的 二进制右数第n位清 0(n从1开始)     

 int GetBits( char *ch,int n)
  {
   if(n<1||n>8)
   {
       return false;
  }
    *ch&=~(1<<(n-1));
      
} 

4.位反转 (按位取反) 

unsigned int GetBits(unsigned  int n)
  {
   unsigned int tmp=0;
   for(int i=0;i<32;i++)
   {
   	if(((n>>i)&1)!=0)
   	{
   		tmp|=1<<(31-i);
	   }
   }
    return tmp;  
} 
  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值