一.位运算有 ~(取反),<<(左移),>>(右移),&(按位与),^(按位异或),|(按位或),优先级从取反开始,其中左右移有算数左右移和逻辑左右移。算数左右移空位补0,逻辑左右移空位补1。
位运算可以用于判断一个数某位为0还是1比如
#include "stdio.h"
void main()
{
char cCode;
scanf("%c",&cCode);
cCode=cCode&0xf0;/*取该数二进制前4位*/
printf("%x \n".cCode);
getch();
}
这个程序利用了按位与,取得一个数的前4位。
判断键盘输入的运用:
#include <stdio.h>
#include <stdlib.h>
#include <bios.h> /*包含了bioskey这个老函数*/
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
while(1) {
int temp=bioskey(1);/*直接取得键盘的输入,只在dos下有效,所以一般编译器没有包含*/
int iHigh=temp>>8;/*按位向右移八位取得高八位*/
int iLow=temp&0x00ff;/*按位高位与0,取得低八位*/
if(iLow=27) {/*27为esc的编码*/
break;
} else if(iLow=0) {/*低八位为0*/
printf("按下键的是功能键和组合键%d",iHigh);/*输出代表的是功能键编码*/
} else {
printf("按下键的是功能键%d",iLow);/*输出代表的是键盘ascll码*/
}
}
return 0;
}
二.位段
一个int类型一般为2-4字节,而如果用来储存一个日期的话就浪费了很多,所以c语言提供了位段的用法,就是把一个字节用来储存多个数据,用struct来定义位段结构,下面这个程序用这个方法储存一个日期
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
struct date_struct{
unsigned int day:5;
unsigned int month:4;
unsigned int year:14;
};
struct date_struct stDate_byte;/*定义date_struct类型的变量*/
stDate_byte.day=12;
stDate_byte.month=6;
stDate_byte.year=2008;
printf("%d,%d,%d",stDate_byte.day,stDate_byte.month,stDate_byte.year);
return 0;
}
位段还可以在中间定义无名位段 struct date_struct{
unsigned int day:5;
unsigned int month:4;
unsigned int :4;
unsigned int year:14;
};
那么中间就会空开,还可以定义为零的无名位段,这样第二位段就会从别除开始储存。
一个位段不能跨两个储存单元,如果一个单元不够就从下一单元开始,定义的位段不能大于储存单元。