C语言位操作

回想c语言位操作知识结构

  • 常见位操作优先级
  • 位操作的对象是二进制数,常见为整型数据。
  • 位操作的基本运算
  • 注意右移时候有符合与无符合的区分。

一、某位置1清0或者某几位置1清0

#includ
int main()
{
	int a;
	a &= ~(1<<5);//    &=位与,某位置0清0。
	a |=(1<<5);//     |=位或,某位置1再赋值。
	
}

进阶思考连续几位置1清0的方法。

#include
int main()
{	
	int a =0xff;//先赋值一个变量便于观察1111 1111
	a &= ~(0x0f<<4);//需要连续几位就直接写几位连续
	                //二进制,再移动到需要更改的起
	                //始位即可。
	printf("a=%#x\n",a);		
	
	int b =0x0f; //0000 1111
        b |=(0x0f<<4);//11111111
        printf("b=%#x\n",b);
        
}

二、给定一个整形数a,求a的bit3到bit8对应的整数

#include
int main()
{
	
}

三、用c语言给一个寄存器(32位)的bit7~bit17赋值937.

为了改变某些位,而不改变其他位,寄存器常用位操作解决读-改-写3步

#include
int main()
{
 int a=0xacf71; //1010 1100 1111 0111 0001
 		//bit7~17 10 1100 1111 0
 a &=~(0x7ff<<7);
 a |=937<<7;
 printf("a=%#x\n",a);
 
}

对俩同时赋值初级程序员

#include
int main()
{
 int a=0xacf71; //1010 1100 1111 0111 0001
        //bit7~17 10 1100 1111 0
 a &=~(0x7ff<<7);
 a |=937<<7;
 a &=~(0x1f<<7);
 a |=17<<21;

 printf("a=%#x\n",a);
 
}
``

高级程序员

四、实现将寄存器的bit7~bit17的值加17(其他不受影响)

#include
int main()
{
   int a = 0xacf71;     //随机定义一个变量观察数据
   unsigned int temp;   //暂时存放读出值与写入值
   temp = a&(0x7ff<<7)//a待读取数据,0x7ff需要读取几位
   			//左移位数取决于从那位开始
   temp >>= 7;		//换算成原来值
   temp += 17;		//重新赋值
   a &=  ~0x7ff<<7; //清0操作
   a |= temp<<7;	//置一操作也就是写入操作
   printf("%#x\n",a);
   return 0;
}

总结

1、C语言位操作重要的就是&,|,^,<<,>>,~运算操作符,其中&1表示读值操作,&0表示清0操作比如,1010&a,a=1010 .进阶a&=~(1<<2)清0操作 a|=1<<2置1操作

2、掌握好3与4例子基本位操作没有问题。

你可能感兴趣的:(C/C++,c语言,编程语言)