c笔记——位运算

来源:互联网 发布:英语翻译 知乎 编辑:程序博客网 时间:2024/06/06 10:00

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

#include<stdio.h>#include<stdlib.h>int main(int argc,char** argv){unsigned int i=0x78;//0111 1000//设置i的第2位1i |= 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位为011i=(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
原创粉丝点击