位运算(c语言)2019-3.2

本文介绍了C语言中的位运算,包括取反、左移、右移、按位与、按位异或和按位或,以及它们的优先级。通过实例展示了如何使用位运算判断数的某位是否为0或1。此外,还讲解了位段的概念,如何使用位段结构节省存储空间,以及如何定义和使用无名位段。
摘要由CSDN通过智能技术生成

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

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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值