用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;
}