位运算(c语言)2019-3.2

        一.位运算有 ~(取反),<<(左移),>>(右移),&(按位与),^(按位异或),|(按位或),优先级从取反开始,其中左右移有算数左右移和逻辑左右移。算数左右移空位补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 
#include 
#include  /*包含了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 
#include 
/* 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;
        
    }; 

那么中间就会空开,还可以定义为零的无名位段,这样第二位段就会从别除开始储存。

一个位段不能跨两个储存单元,如果一个单元不够就从下一单元开始,定义的位段不能大于储存单元。

 

 

你可能感兴趣的:(c语言)