c笔记——位运算

用c编写低级程序,位运算非常重要

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char** argv){
	unsigned int i=0x78;//0111 1000
	//设置i的第2位1
	i |= 1<<2;
	printf("%x\n",i);//0x7c

	//将i的第六位清零
	i &= ~(1<<6);
	printf("%x\n",i);//0x3c

	//测试某一位的状态
	if(i & 1<<5);

	//假设用一个unsigned char型表示8种颜色
	typedef enum{
		COLOR_BLACK=1,
		COLOR_RED=2,
		COLOR_BLUE=4,
		COLOR_MAGENTA=8,
		COLOR_GREEN=16,
		COLOR_CYAN=32,
		COLOR_YELLOW=64,
		COLOR_WHITE=128
	}Color;

	unsigned char color=0x56;
	if(color & COLOR_GREEN)
		printf("Have COLOR_GREEN\n");
	color &= COLOR_YELLOW;//设置黄色
	color |= ~(COLOR_YELLOW);//清除黄色

	if(color & (COLOR_GREEN | COLOR_MAGENTA));//测试两种颜色
	
	//设置连续的位(位域),比如要设置i的5-7位为011
	i=(i & ~(7<<5)) | (3<<5);//先清零,再赋值
	printf("%x\n",i);

	//获取位域,比如获取i的3-5位,先右移到最低位,再取
	unsigned int j=(i>>3) & 0x07; 
	printf("%x\n",j);
	
	//日期结构(结构位域)
	struct Date{
		unsigned int day:5,month:4,year:7;
	
	};
	Date date;
	date.year=9;date.month=9;date.day=28;
	printf("%d/%d/%d\n",date.day,date.month,date.year+1980);


	//我们知道 intel 80X86 包含16位寄存器 AX,BX,CX,DX
	//AX又可以分为两个8位寄存器 AH,AL 高八位和低八位
	//假设需要对16位寄存器和8位寄存器都访问,同时保留他们之间的关系

	union Regs{
		struct{
			unsigned int ax:16,bx:16,cx:16,dx:16;
		}X16;
		struct{
			unsigned char al,ah,bl,bh,cl,ch,dl,dh;
		}X8;
	
	};
	Regs regs;
	regs.X8.al=0x34;
	regs.X8.ah=0x12;

	printf("AX:%x\n",regs.X16.ax);
	
}

下面是用异或 ^ 加密的简单原理

A^B=result;

result^B=A^B^B=A;

B是秘钥,将密文再与秘钥^便得到明文


#include<ctype.h>
#include<stdio.h>
#define KEY '&'
void jiami(char *src,char key){
	char *p=src;
	while(*p++!='\0'){
		if(iscntrl(*p^key)|| iscntrl(*p));
		else
			*p=*p^key;
	}

}
int main(){
	char buf[1024];
	while(fgets(buf,1024,stdin)){
		printf("加密前:");
		printf("%s\n",buf);
		printf("加密后:");
		jiami(buf,KEY);
		printf("%s\n",buf);
		printf("再次加密,即解密:");
		jiami(buf,KEY);
		printf("%s\n",buf);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值