汉扬编程 编程大纲 C/C++位运算是一个精细活:大小写转换与汉字反显

C/C++位运算是一个精细活:大小写转换与汉字反显

C和C++中内存虽以字节为单位进行寻址。但很多信息却可以以逻辑位来处理,如用二维位数组来描述一个位图或一个字符的点阵信息。用一个或多个字节来表示这类信息有点浪费,为此C和c++对位运算提供了充分的支持,如位运算符、位域、STL中bitset等。

C/C++位运算是一个精细活:大小写转换与汉字反显

1 位运算描述

C/C++位运算是一个精细活:大小写转换与汉字反显

C/C++位运算是一个精细活:大小写转换与汉字反显

2 位运算的具体实例

C/C++位运算是一个精细活:大小写转换与汉字反显

C/C++位运算是一个精细活:大小写转换与汉字反显

3 常用操作

C/C++位运算是一个精细活:大小写转换与汉字反显

C/C++位运算是一个精细活:大小写转换与汉字反显

实例:在右端截取n个二进制位

#include <stdio.h> // 在右端截取n个二进制位#include <cmath>int rnbit(int num,int ri,int rj)// 从最右边往左算,截取第ri位到第rj位的值{ int n = rj-ri+1; int tmp = num >> ri; // 左移ri位,截取最右边的n位 int mask = ~(~0<<n); // 确保mask最右边的n位全为1,下面两种写法等价 //int mask = (1 << n)-1; //int mask = pow(2,n)-1; printf("%x\\n",mask); return (tmp & mask); //高32-n位清0,留下低n位}int main(){ int a = 0x12345678; printf("%x\\n",rnbit(a,4,7)); // 7 printf("%x\\n",rnbit(a,4,11)); // 67 while(1); return 0;}具体的计算过程:

再看一个实例代码:一个单词的首字母大小,其余字母小写

#include<stdio.h> // 一个单词的首字母大小,其余字母小写void strConvert(char s[]){ #define SPACE 32 // 空格的ASCII码是32 int diff = 'a'-'A'; // 97- 65/* 仔细观察相同字母大、小写的二进制编码,就是高5位不同A 65 01000001 Z 90 01011010 a 97 01100001 z 122 01111010 32 00100000 // 大写字母与 32的”|“运算变为小写,小写与 32的”|“运算则还是小写, // 也就是高5位置1,转换为小写 ~32 11011111 // 小写字母与~32的&运算变为大写,大写与~32的&运算则还是大写 // 也就是高5位置0,转换为大写*/ int i; for(i=0;s[i]!='\\0';i++) if(s[i]!=SPACE) if(i==0 ||s[i-1]==SPACE) s[i]=s[i]&~diff; else s[i]=s[i]|diff; }int main(){ char s[]="IT was the BEST of TIME,it was the WORST of times!"; strConvert(s); printf("%s\\n",s); // It Was The Best Of Time,it Was The Worst Of Times! while(1); return 0;}一个汉字反显的实例:

我们来看一下汉字的点阵显示:

显然可以用一个24*24的二维的位数组来表示。

24*24点阵字库是以行24点和列24点来描绘一个汉字的,每个字节(Byte)为8位(8 Bits),以一位对应一个字库的点来计算,72个字节就是72*8=576 Bits,刚好能够描述一个24*24(576点)的汉字。

有的汉字字库的点阵信息用一个int[24][3]来存储,一个int只使用其最低位字节。将每一个int的最低位字节(低8位)一一解析出来,存储到一个int[24][24]数组中,即可以用字符来显示一个汉字,但显示的字体是反的:

#include <iostream>using namespace std; int hz[24][3]= // “语”的点阵信息,位图数据一般是一个二维位数组 { 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x00,/*8*9*/ 0x00,0x60,0x00,0x30,0x40,0x0C,0x18,0xFF,0xFC, 0x1C,0x40,0x18,0x00,0x00,0x20,0x00,0x0C,0x40, 0x10,0x0C,0x00,0x11,0x89,0xFC,0x11,0x88,0xFE, 0x31,0xF8,0x84,0x3F,0x89,0x84,0x31,0x09,0x84, 0x21,0x09,0x0C,0x23,0x79,0x0C,0x23,0xDB,0xFC, 0x62,0x1B,0x04,0x20,0x10,0x00,0x00,0x10,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };int main(){ int i,j,k; for(i=0;i<24;i++) { for(j=0;j<3;j++) { for(k=7;k>=0;k–) { int t = hz[i][j]>>k&0x01; if(t==1) printf("■"); else printf(". "); } } cout<<endl; } while(1); return 0;}

所以还需要修正成正立:

#include<stdio.h>int main(){ int hz1[24][3]= { 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x00, 0x00,0x60,0x00,0x30,0x40,0x0C,0x18,0xFF,0xFC, 0x1C,0x40,0x18,0x00,0x00,0x20,0x00,0x0C,0x40, 0x10,0x0C,0x00,0x11,0x89,0xFC,0x11,0x88,0xFE, 0x31,0xF8,0x84,0x3F,0x89,0x84,0x31,0x09,0x84, 0x21,0x09,0x0C,0x23,0x79,0x0C,0x23,0xDB,0xFC, 0x62,0x1B,0x04,0x20,0x10,0x00,0x00,0x10,0x00, 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; int hz2[24][24]; int i,j,k,m,n; //for(i=0; i<24; i++) for(i=23; i>=0; i–) { for(j=0; j<3; j++) //for(j=2; j>=0;j–) { m=hz1[i][j]; for(k=7; k>=0; k–) { n=m>>k&0x01; hz2[j*8+7-k][i]=n; } } } for(i=0; i<24; i++) { for(j=0; j<24; j++) if(hz2[i][j]!=1) //反显请将==改成!= printf("■"); //●,中等全角字符,反显的时候用:■ else printf(". "); printf("\\n"); } while(1); return 0;}

ref

《C语言从入门到精通_丁亚涛》

-End-

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6070.html

干货|大牛谈嵌入式C语言的高级用法

C语言实践|程序设计入门

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部