今天在看base64编码转换时,既然对负数的二进制表示有些遗忘,在网上找了一下资料,贴出来已备在此遗忘:
假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
现在想知道,-5在计算机中如何表示?
在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
再举一例,我们来看整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码: 11111111 11111111 11111111 11111110
3、得补码: 11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF
//==============================================================
//以下是Based64转码,在http传输的时候用得比较多。
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 /**
2 This stream filter converts a stream of bytes to their
3 Base64 encoding.
4
5 Base64 encoding encodes 3 bytes into 4 characters.
6 |11111122|22223333|33444444|
7 Each set of 6 bits is encoded according to the
8 toBase64 map. If the number of input bytes is not
9 a multiple of 3, then the last group of 4 characters
10 is padded with one or two = signs. Each output line
11 is at most 76 characters.
12 */
13 class Base64OutputStream extends FilterOutputStream
14 {
15 /**
16 Constructs the stream filter
17 @param out the stream to filter
18 */
19 public Base64OutputStream(OutputStream out)
20 {
21 super(out);
22 }
23
24 public void write(int c) throws IOException
25 {
26 inbuf[i] = c;
27 i++;
28 if (i == 3)
29 {
30 super.write(toBase64[(inbuf[0] & 0xFC) >> 2]);
31 super.write(toBase64[((inbuf[0] & 0x03) << 4) | ((inbuf[1] & 0xF0) >> 4)]);
32 super.write(toBase64[((inbuf[1] & 0x0F) << 2) | ((inbuf[2] & 0xC0) >> 6)]);
33 super.write(toBase64[inbuf[2] & 0x3F]);
34 col += 4;
35 i = 0;
36 if (col >= 76)
37 {
38 super.write('\n');
39 col = 0;
40 }
41 }
42 }
43
44 public void flush() throws IOException
45 {
46 if (i == 1)
47 {
48 super.write(toBase64[(inbuf[0] & 0xFC) >> 2]);
49 super.write(toBase64[(inbuf[0] & 0x03) << 4]);
50 super.write('=');
51 super.write('=');
52 }
53 else if (i == 2)
54 {
55 super.write(toBase64[(inbuf[0] & 0xFC) >> 2]);
56 super.write(toBase64[((inbuf[0] & 0x03) << 4) | ((inbuf[1] & 0xF0) >> 4)]);
57 super.write(toBase64[(inbuf[1] & 0x0F) << 2]);
58 super.write('=');
59 }
60 }
61
62 private static char[] toBase64 =
63 {
64 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
65 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
66 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
67 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
68 };
69
70 private int col = 0;
71 private int i = 0;
72 private int[] inbuf = new int[3];
73 }
74
分享到:
相关推荐
补码表示法是一种常用的二进制表示法,它将负数表示为其补码的形式。补码是将二进制数的每一位取反,然后加 1 得到的结果。例如,二进制数 1010 的补码是 0101 加 1 得到的 0110。 在 dec2binPN 函数中,我们首先...
* 正数的二进制表示形式的第一位数字为 0,而负数的二进制表示形式的第一位数字为 1。 * 将十进制数转换成其他进制可以使用 Java 语言中的 Integer.toBinaryString()、Integer.toHexString()、Integer.toOctalString...
接着,我们使用按位取反的方法来生成负数的二进制数。最后,我们将处理完的十进制数转换为二进制数,并将其输出。 在 Matlab 中,可以使用以下代码来调用该函数: ```matlab clc % 输入的十进制数,可以是正数也...
在Delphi编程语言中,处理这种二进制表示负数的过程可以通过内置函数或者自定义算法来实现。Delphi提供了诸如IntToBin和BinToInt这样的函数,用于在十进制和二进制之间进行转换。然而,当你需要处理负数时,这些内置...
总结来说,负数的二进制表示是通过符号位和2的补码实现的,这使得计算机能够高效地执行加法和减法运算,同时处理溢出情况。对于编程和系统设计人员,理解和掌握这些基本概念是至关重要的,因为它们构成了现代计算机...
负数二进制表示的计算机实现 在计算机系统中,二进制数的表示是非常重要的。前面我们已经了解了二进制数的基础知识,但是在实际应用中,二进制数还需要考虑负数的表示。负数的表示是计算机系统中非常重要的一部分,...
本文将深入探讨浮点数的二进制表示,并通过一个源代码实例介绍如何进行浮点数与二进制之间的转换。 浮点数的二进制表示遵循IEEE 754标准,该标准定义了单精度(32位)和双精度(64位)浮点数的格式。对于单精度...
对于小数的进制转换,通常会涉及到浮点数的二进制表示,如IEEE 754标准。Java并没有直接提供将十进制小数转换为其他进制的内置方法,但可以通过一些数学运算和位操作实现。例如,将十进制小数转换为二进制通常需要...
### C语言浮点数的二进制表示 #### 前言 在计算机科学领域,尤其是在编程语言如C语言中,了解数据类型的底层实现是非常重要的。对于浮点数而言,其内部表示方式决定了如何准确地处理数值计算。本文将深入探讨C语言...
在补码表示中,负数是通过对其绝对值的二进制表示逐位取反(除了最高位,即符号位保持不变)后再加1来获得的。这确保了加法和减法运算的简单性和一致性。 以下是`dec2binPN()`函数的详细工作原理: 1. **输入参数*...
任意输入一个十进制整数,包括正数负数,通过程序实现可以输出相应的二进制编码
通过查看"floatbin"的源代码,开发者可以学习如何解析和构建浮点数的二进制表示,理解指数和尾数的计算方法,以及如何处理溢出和下溢等异常情况。此外,对于理解和优化浮点数运算,以及深入学习计算机体系结构和编译...
这种方法适用于大部分情况,但不适用于负数,因为负数的二进制表示是补码形式。 为了处理负数,我们可以使用`std::bitset`类,它是C++标准库的一部分,能方便地处理二进制数据: ```cpp #include std::string ...
在编程中,调试工具可以帮助我们查看变量的二进制、八进制、十六进制或十进制表示,以便理解其实际值。 6.7 本章小结 进制转换虽然看似简单,但却是理解计算机底层工作原理的关键。掌握不同进制间的转换有助于我们...
本文通过一个具体的Java程序实例,详细介绍了如何将十进制数(包括正数和负数)转换为二进制表示的方法。通过对程序逻辑的逐步分析,我们不仅学习了基本的转换过程,还深入了解了负数在计算机中的补码表示方式。这种...
3. **负数的二进制表示**: 在计算机中,负数通常使用二进制补码表示。补码是将正数的二进制表示按位取反(0变1,1变0),然后加1得到的。对于负数,最高位(符号位)通常设置为1,表示这是一个负值。 4. **C++...
将所有余数倒序排列,得到的就是二进制表示。对于负数,可先将其转换为正数进行计算,再在前面加上负号。 ```cpp #include #include std::string decimalToBinary(int num) { std::bitset<32> bits(num); ...
在实际应用中,可能还需要考虑一些额外的问题,比如数据验证(确保输入的是有效的二进制字符串)、错误处理(处理除法溢出、负数等特殊情况)、性能优化(对于大量数据的快速转换)等。这些都是提高代码质量、可靠性...