置位的意思是置 1,我以变量字节数最大为 4 字节为例,你可以定义一个掩码(你可以扩展这个掩码至 64 位),再定义一个函数,实现指定的数与对应的掩码进行位或运算即可。如:
为资阳等地区用户提供了全套网页设计制作服务,及资阳网站建设行业解决方案。主营业务为成都网站设计、成都做网站、资阳网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
#include assert.h
#include stdio.h
unsigned int dwMasks[] = {
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000, 0x00080000,
0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x20000000, 0x40000000, 0x80000000,
};
unsigned int set_bit(unsigned int value, int nIndex)
{
assert(nIndex = 0 nIndex 32);
return value | dwMasks[nIndex];
}
int main()
{
printf("set_bit(100, 0)=%u\n", set_bit(100, 0));
printf("set_bit(100, 1)=%u\n", set_bit(100, 1));
printf("set_bit(100, 2)=%u\n", set_bit(100, 2));
printf("set_bit(100, 3)=%u\n", set_bit(100, 3));
printf("set_bit(100, 4)=%u\n", set_bit(100, 4));
printf("set_bit(100, 5)=%u\n", set_bit(100, 5));
return 0;
}
Linux 下编译及测试结果如下:
[root@iZ25a38chb4Z test]# g++ test.cpp -g3 -Wall -o test
[root@iZ25a38chb4Z test]# ./test
set_bit(100, 0)=101
set_bit(100, 1)=102
set_bit(100, 2)=100
set_bit(100, 3)=108
set_bit(100, 4)=116
set_bit(100, 5)=100
100 的二进制表示为:1100100, 第 2 位和第 5 位本来就为 1,所以置 1 后结果仍然为原来的数。
以上这种方法叫查表法,通常应用于实际项目开发中,效率非常之高。
对不起确实没看清题,修改一下:
state |= 0x400; //将第10位用bitwise or置位
state = ~(0x8000); //将第15位用bitwise and清除,因为state的类型不详,先用~将0x8000取反
printf( "state第10位的值为%d.", (state 0x400 ?1:0) ); //用and提取第10位
另外,我这里printf输出是1,还请检查是否键入正确,如果不对,请试试将其中 state 0x400 用括号括住,即 printf( "state第10位的值为%d.", ((state 0x400)?1:0) );
或者采用移位的方法,即 printf( "state第10位的值为%d.", state10) );
1 测试指定的位
unsigned char BitTst(unsigned char *Pa,char b)//Pa为被测试的对象的地址,b值为指定的位
{
return *Pa (1b);
}
用法:
unsigned char x,y;
y=0x4F;
x=BitTst(y,3);
2 将指定的位置“1”
void BitSet(unsigned char *Pa,char b)//Pa为置位对象的地址,b值为指定的位
{
*Pa|=1b;
}
用法:BitSet(x,6);
3 将指定的位清“0”
void BitClr(unsigned char *Pa,char b)//Pa为清零位对象的地址,b值为指定的位
{
*Pa=~(1b);
}
用法:BitClr(x,6);
4 将指定的位取反
void BitCpl(unsigned char *Pa,char b)//Pa为取反位对象的地址,b值为指定的位
{
*Pa^=1b;
}
置位和复位指令说明如下。
置位指令就是让数字电路一个GPIO输出为高电平。汇编一般是SET指令。
复位指令就是让数字电路一个GPIO输出为低电平。汇编一般是RST指令。
置位即置1,复位即置0。置位和复位指令可以将位存储区的某位开始的一个或多个(最多可达255个)同类存储器位置1或置0。大多用来控制外部电路的通和断,或者产生一些固定的波形。
说明学习编程的过程,就是一个了解工具,学习使用工具,理解工具作用原理,改装乃至发明工具的过程。它不像你学写字,会写字之后,用什么笔,用什么纸,你都能写字来表达。所以入门学编程,最好的方式就是上机写代码做习题,做项目,得把这个工具具体实际的用起来,而不单单是买书看书做笔记。只看说明书,是很难完全学会使用工具的。当然C语言是入门的基础。
bwXXXX是你需要设置的那个数的位数
bsXXXX是你需要设置的数需要左移的位数
比方说现在有一个数是0x12345678;
你想把8-11位设置为3,那么
bw就是4(8-11是4位数)
bs就是8,因为是从bit8开始,所以要左移8位
#define bwTEST 4
#define bsTEST 8
那么
INT i=0x12345678;
SET_BITS(i, TEST, 3);
置位 就是把这位置于1或者0 一般都是1。
对某一位进行操作。大多时和硬件打交道的场合