c语言bit操作
㈠ 为什么c语言能进行位(bit)操作
在编程时,有时要为程序定义很多bool型变量
比如:
struct XX{
bool bReady,bLoaded,bRender,bShow;
};
这样很罗嗦,我们换一种方法:1个32位的long型变量 本身可以代表32个bool型
我们先定义
#define FLAG_READY 0x0001
#define FLAG_SHOW 0x0002
#define FLAG_LOADED 0x0004
这样
再搞一个 long Flag;变量
设置和取消该标志位用 Flag|=FLAG_SHOW 和 Flag&=~FLAG_SHOW
判断使用 if (Flag & FLAG_SHOW) {...}
比以前的方便,而且Microsoft 的函数API很多都是这种方式
㈡ c语言的按位运算符怎么操作!
位运算
在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。
一、位运算符C语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下: 00001001|00000101
00001101 (十进制为13)可见9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)
main(){
int a=9;
a=a^15;
printf("a=%d\n",a);
}
4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110
5. 左移运算 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,
高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6. 右移运算右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
请再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
㈢ 为什么C语言能进行对位(bit)操作 对位操作有什么效果
当然可以对位进行操作。
一般来说,用位运算就是对位操作。位运算包括
^ 异或
| 位或
& 位与
~ 位求反
>> 右移位
<< 左移位
对位操作的好处是快,并且基本上和汇编一一对应,可以直接算出运算时间,计算速度。
很多要表达硬件计算,或者提高运算速度的时候,都会直接用位运算。
比如乘16,位运算就是左移4位等等。
另外一种是位域。
就是定义一种特殊的结构体,里面的成员只有规定的几位。
比如
struct instruction{
unsigned short sr:5;
unsigned short tr:5;
unsigned short op:6;
};
就定义了一个16bit指令的结构,其中
sr : tr : op
1-5 : 6-10 :11-16
然后就可以这样操作
struct instruction mov_r1_r3 = {0x01, 0x03, 0x01};
那么mov_r1_r3实际上等于0x0461
这样编代码一般是为了和硬件接口容易,完全的底层操作
实际代码中极少出现,一般出现于与硬件的接口当中.
㈣ C语言中sbit是什么意思,与bit有什么区别
1.C语言中没有sbit关键字,这个是编译器里面的关键字。 sbit应该是keil c51中的关键字,表示位寄存器。一个端口8位,用这个关键字,可以单个位操作。
2.bit和sbit都是C51扩展的变量类型。典型应用是:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
㈤ c语言中bit与sbit的区别
1. 在C语言中,"bit"和"sbit"的定义和使用场景存在显着差异。
2. "bit"作为基本的数据单位,用于表示二进制位,其值只能是0或1。
3. "sbit"则主要用于嵌入式编程,表示特殊的位字段,通常与硬件寄存器的特定位相关。
4. "bit"是计算机信息处理的基础,是所有数据类型的组成部分。
5. "sbit"在嵌入式系统中用于表示硬件寄存器的特殊位,便于进行精确的操作。
6. 使用"sbit"可以方便地设置或清除特定的位标志,这些标志通常与硬件的状态或功能直接相关。
7. 需要注意的是,并非所有编译器都支持"sbit"关键字,这取决于具体的编译器和编程环境。
8. 理解"bit"和"sbit"的区别,有助于在编程时更准确地使用它们。