非数值数据的表示以及十进制数的二进制编码(BCD)表示

非数值符号编码

计算机对非数值符号的处理大致分三个过程:字符输入,机内处理,字符输出;这就对应这三种阶段的编码,这里叫做输入码,机内码,字形码,不同阶段可以用 相同的编码技术。这只是我对中文编码的扩展,因为都是非数值符号,所以中文和西文没有什么太大区别。

这里主要以汉字的处理为主,西文的处理类似。汉字输入码的编码方式大致分四种:流水码(国标码,区位码),音码(全拼,智能ABC),形码(五笔),音形码。汉字机内码是计算机内存储和处理汉字时候用到的编码(GB2312,ascii,utf-8),这种对应关系是在硬盘中或者内存中存储着ascii或者GB2312的码表。汉字的区位码和机内码的对应关系:区位码+A0A0H;这样保证两个字节的中文表示中单字节最高位为1,可以表示出当两个字节时候是表示一个中文还是两个西文字符。汉字字形码,就是输出文字时候的点位,通过01画出字符。

之前一直在努力弄明白8421BCD码和ascii的关系,今天终于搞明白了。十进制的8421BCD码表示和十进制的二进制数字表示并不一样,例如:0001 1000,当把它视为二进制数时,其值为24;但作为2位BCD码时, 其值为18。又例如0001 1100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个非法编码 。当用户输入55的时候计算机用0110101 0110101两个ascii编码来表示55,但是这不是十进制中的55的二进制表示(明显不是),所以计算机会把这两个ascii字符编码的二进制表示转换成十进制的二进制编码表示,也就是8421BCD编码(ascii数字编码的二进制表示去掉高三位便是十进制的二进制编码表示),这时计算机会把十位的5(101)乘与10(1010)得到50(110010),个位的5(101)乘与1(1)得到5(101),然后相加便是十进制55的二进制表示(110111),他的逆过程便是计算机想把110111(55),在控制台显示“55”,计算机在把二进制表示成十进制字符串表示时候先判断这个二进制表示的十进制的最高位是多少,通过连续除于1010直到余数小于1010(10),本例中110111经过这种方式判断为两位,所以:它首先会用110111(55)除于1010(10)等于101(5),然后发现对应于8421BCD中的“5”,然后输出,用110111-101*1010便是101,发现对应于计算机的8421BCD中的“5”,然后输出,这时候便是“55”的表示。

非数值数据的表示以及十进制数的二进制编码(BCD)表示,布布扣,bubuko.com

时间: 2024-11-01 02:03:31

非数值数据的表示以及十进制数的二进制编码(BCD)表示的相关文章

数制之非十进制数转十进制数

二进制转成十进制方法按权相加法:数码与权值相乘,然后将积相加1010101上面这个二进制数转成十进制数是首先,先展开从右到左公式数码 乘以 基数的数码位数减1次幂(12零次方 ) +(02一次方)+(12二次方)+(02的4 - 1方)+(12的5-1)+(02的6-1方)+(1*2的6-1方) 八进制转成十进制数码与权值相乘,然后将积相加3243数码与基数的数码位数-1次幂相乘38的4-1次方 + 28 的 3-1次方 + 48 的2-1次方 38的1-1次方 十六进制转成十进制数码与权值相乘

打印出从1到最大的n位十进制数

首先这一题会溢出,要考虑的大数问题.所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回顾. #include "stdafx.h" #include <iostream> using namespace std; //输入数字n,按照顺序打印出从1到最大的n位十进制数. bool Increament(char *number); void printNumbe

OJ刷题之《将十进制、八进制和十六进制数1000对应十进制数输出》

题目描述 将十进制的1234输出 将八进制的1234对应其十进制数进行输出 将十六进制的1234对应其十进制数进行输出 输入 无 输出 1234D=1234D 1234O=668D 1234H=4660D 样例输出 1234D=1234D 1234O=668D 1234H=4660D 提示 输出第二行的"1234O=668D",1234后的是大写字母O,不是数字0 代码如下: #include <iostream> #include <iomanip> usin

java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果

1 package com.llh.demo; 2 3 import java.util.Scanner; 4 5 /** 6 * 7 * @author llh 8 * 9 */ 10 public class Test { 11 /* 12 * 将任意一个十进制数数字转换为二进制形式,并输出转换后的结果(使用数组存储) 13 */ 14 public static void main(String[] args) { 15 Scanner sc = new Scanner(System.in

十进制数与二进制数的互相转化

二进制数是机器的语言,它与我们常用的十进制数存在着转化的方式 十进制数转化二进制公式:1.整数部分:除2取余 2.小数部分:乘2取整: 或者用数轴法来计算该十进制数为哪几个2的幂的和,然后将相应位置1即可得到二进制数: 二进制转化十进制:找到所有二进制数为1的位,然后将2的位数减一次幂相加即可得到相应的十进制数.

数组-----二进制数与十进制数互换

//二进制数转换为十进制数 #include"stdafx.h" #include<iostream> //#include<string.h> //#include<process.h> using namespace std; void main(){ int i, bitv, w=1, value = 0;//value累加和.bitv位值(0或1).w权值 char a[20]; cout << "Enter a bit

C++实现将十进制数转换为小于等于九的任意进制

//十进制转换为小于等于九的任意进制数 #include<iostream> #include<string> #include<stack> using namespace std; stack<int> num; void change(int N,int M) { if(N<0||M<=1) { cout<<"error!"<<endl; return; } while(N>0) { num

将十进制数转换为十六进制数

package welcome; import java.util.Scanner; public class Decimal2HexCoversion { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("Enter an decimal number: "); int decimal = in.nextInt(); // 调用十进制数转十六进

找出十进制数中出现的&#39;&#39;一&#39;&#39;的个数

一.题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.解决思路 通过列举几个数进行计算,可以发现函数f(N)规律如下: 1.一位十进制数:当N>=1时,f(N)=1:当N=0时,f(N)= 0; 2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4