今后继续整理算法并写出自己的理解和备注。 C++实现的:位设置(bit_set)
1、 位设置(bit_set)
<1> 题目描述: 对一个unsigned char 8 bit数据的指定位置0或置1操作,并保持其他位不变。
函数原型:void bit_set(unsigned char *p_data, unsigned char position, bool flag);
参数说明:p_data 是指定的原数据,position是指定位(取值范围1~8),flag表示是置0还是置1操作
<2> 方法一:分支设置法
<3> 方法二:位操作设置法
源码:
一、位设置(bit_set)
1、分支设置法
#include<iostream>
using namespace std;
void bit_set(unsigned char *p_data, unsigned char position, bool flag)
{
if(flag)//1
{
switch(position)
{
case 1://把第一位置1
*p_data |= 0x01;//想要哪一位为1 则对哪一位进行或运算 1|1=1,1|0=1;
break;
case 2:
*p_data |= 0x02;//0000 0010
break;
case 3:
*p_data |= 0x04;
break;
case 4:
*p_data |= 0x04;
break;
case 5:
*p_data |= 0x05;
break;
case 6:
*p_data |= 0x06;
break;
case 7:
*p_data |= 0x07;
break;
case 8:
*p_data |= 0x08;
break;
}
}
else //flag =0 置0运算
{
switch(position)
{
case 1:
*p_data &=~ 0x01;//先取反,再与运算1&0=0,0&0=0
break;
case 2:
*p_data &=~ 0x02;
break;
case 3:
*p_data &= ~0x03;
break;
case 4:
*p_data &= ~0x04;
break;
case 5:
*p_data &= ~0x05;
break;
case 6:
*p_data &= ~0x06;
break;
case 7:
*p_data &=~ 0x07;
break;
case 8:
*p_data &=~ 0x08;
break;
}
}
}
void main()
{
bool flag = true;//置1为真,置0为假
//bool flag = false;//置0
unsigned char data = 'A';
unsigned char position = 3;
bit_set(&data,position,flag);
cout<<data<<endl;
}
2、 位操作设置法
不需要一个个情况列出来,根据位操作去左移即可
#include<iostream>
using namespace std;
void bit_set(unsigned char *p_data, unsigned char position, bool flag)
{
unsigned char v = 0x01;
if(flag)//1
{
*p_data |= (v <<(position-1));//如果置第五位,则只用移动4位
}
else //0
{
*p_data &= ~(v <<(position-1));
}
}
void main()
{
bool flag = true;
//bool flag = false;
unsigned char data = 'A';
unsigned char position = 3;
bit_set(&data,position,flag);
cout<<data<<endl;
}