1. //
  2. // main.c
  3. // 03-原码反码补码
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[])
  8. {
  9. // int占4个字节 1个字节8位
  10. int num = ;
  11. /*
  12. // 12的二进制
  13. 12在内存中存储的是它的补码
  14. 00000000 00000000 00000000 00001100
  15. 正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码
  16.  
  17. -12
  18. 二进制的最高位我们称之为符号位
  19. 如果符号位是0代表是一个正数,
  20. 如果符号位是1代表是一个负数
  21.  
  22. 10000000 00000000 00000000 00001100 (-12的原码,人思维的码)
  23. 11111111 11111111 11111111 11110011(反码, 符号位不变其它位取反)
  24.  
  25. 11111111 11111111 11111111 11110011
  26. +00000000 00000000 00000000 00000001
  27. _____________________________________________
  28. 11111111 11111111 11111111 11110100(补码 , 反码+1,内存中存储的)
  29.  
  30. 结论:无论正数负数在内存中存储的都是补码
  31.  
  32. 11111111 11111111 11111111 11110101 (补码)
  33. -00000000 00000000 00000000 00000001 (-1)
  34. _____________________________________________
  35. 11111111 11111111 11111111 11110100 (反码)
  36. 10000000 00000000 00000000 00001011
  37.  
  38. */
  39. printf("%d\n", 0b11111111111111111111111111110101);
  40. return ;
  41. }
  1. //
  2. // main.c
  3. // 01-进制
  4. #include <stdio.h>
  5.  
  6. int main(int argc, const char * argv[])
  7. {
  8. // 1.默认就是10进制
  9. int num = ;
  10. // 2.在前面加上一个0就代表八进制
  11. int num1 = ;
  12.  
  13. // %d是以十进制的方式输出一个整数
  14. printf("%d\n", num1);
  15. // %o是以八进制的方式输出一个整数
  16. printf("%o\n", num);
  17.  
  18. // 在数值前面加上0b就代表二进制
  19. int num2 = 0b1100;
  20. printf("%d\n", num2);
  21. // 在数值前面加上0x就代表十六进制
  22. int num3 = 0xc;
  23. printf("%d\n", num3);
  24. // %x是以十六进制的方式输出一个整数
  25. printf("%x\n", num);
  26.  
  27. // 口诀:不看你怎么存,只看你怎去取
  28.  
  29. return ;
  30. }
  1. //
  2. // main.c
  3. // 02-进制转换
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[])
  8. {
  9.  
  10. /*
  11. 十进制 -> 二进制
  12. 9
  13. 转换原理:除2取余 倒序读取
  14.  
  15. 9/2 4 1
  16. 4/2 2 0
  17. 2/2 1 0
  18. 1/2 0 1
  19.  
  20. 9 --> 1001
  21.  
  22. 二进制 --> 十进制
  23. 1001
  24. 转换原理:乘以2的幂数(幂数从0开始), 然后相加
  25.  
  26. 1 * 2(0) = 1
  27. 0 * 2(1) = 0
  28. 0 * 2(2) = 0
  29. 1 * 2(3) = 8
  30.  
  31. 1 + 0 + 0 + 8 = 9
  32.  
  33. 1 1 1 1 1
  34. 16 8 4 2 1
  35.  
  36. N位二进制的取值范围
  37. 1位 取值范围 0~1 0~2的1次方-1
  38. 2位 取值范围 0~3 0~2的2次方-1
  39. 3位 取值范围 0~7 0~2的3次方-1
  40. n位 取值范围 0~2(n)-1
  41.  
  42. 000
  43. 001
  44. 010
  45. 011
  46. 100
  47. 101
  48. 110
  49. 111
  50.  
  51. 11111 0~ (32-1)
  52.  
  53. 二进制转换为八进制 进制越大表示的位数就越短
  54. 规律:三个二进制位代表一个八进制位
  55. 因为3位的最大取值是7 而八进制是逢八进一
  56.  
  57. 1个字节 8位
  58. 000 0
  59. 001 1
  60. 100 4
  61.  
  62. 014
  63.  
  64. 二进制转换为十六进制
  65. 规律:四个二进制位代表一个十六进制位
  66. 因为4位的最大取值是15, 而十六进制是逢十六进一
  67.  
  68. 0000 0
  69. 1100 c
  70.  
  71. 0xc
  72.  
  73. */
  74. printf("%d\n", 0b1001);
  75.  
  76. return ;
  77. }
  1. //
  2. // main.c
  3. // 05-位运算
  4.  
  5. #include <stdio.h>
  6. /*
  7. 位运算都是针对二进制的
  8. &
  9. |
  10. ^
  11. ~
  12.  
  13. <<
  14. >>
  15. */
  16. int main(int argc, const char * argv[])
  17. {
  18.  
  19. /*
  20. & 按位与
  21. 特点:只有对应的两位都是1才返回1 否则返回0
  22. 口诀: 一假则假
  23. 规律:任何数按位与上1结果还是那个数
  24.  
  25. 1001
  26. & 0101
  27. _______
  28. 0001
  29.  
  30. 1001
  31. &1111
  32. ______
  33. 1001
  34. */
  35.  
  36. /*
  37. | 按位或
  38. 特点:只要对应的两位其中一位是1就返回1
  39. 口诀:一真则真
  40.  
  41. 1001
  42. | 0101
  43. ________
  44. 1101
  45. */
  46. /*
  47.  
  48. ^ 按位异或
  49. 特点:对应的两位不相同返回1 相同返回0
  50.  
  51. 1001
  52. ^ 0101
  53. _______
  54. 1100
  55.  
  56. // 多个整数按位异或的结果和顺序无关
  57. 1001
  58. ^ 0101
  59. _______
  60. 1100
  61.  
  62. 1100
  63. ^ 0110
  64. _______
  65. 1010
  66.  
  67. 1001
  68. ^ 0110
  69. _______
  70. 1111
  71.  
  72. 1111
  73. ^ 0101
  74. _______
  75. 1010
  76.  
  77. // 相同整数按位异或结果是0
  78. 1001
  79. ^ 1001
  80. _______
  81. 0000
  82.  
  83. // 任何整数按位异或上0结果不变
  84. 1001
  85. ^ 0000
  86. _______
  87. 1001
  88.  
  89. // 任何整数按位异或上另一个整数两次结果还是那个数
  90. 1001
  91. ^ 1001
  92. ____________
  93. 0000
  94.  
  95. 0000
  96. ^0101
  97. ______
  98. 0101
  99.  
  100. */
  101. // int result = 9 & 5;
  102. // int result = 9 | 5;
  103.  
  104. // int result = 9 ^ 5;
  105. // 多个整数按位异或的结果和顺序无关
  106. // int result2 = 9 ^ 5 ^ 6;
  107. // int result2 = 9 ^ 6 ^ 5;
  108. // 相同整数按位异或结果是0
  109. // int result3 = 9 ^ 9;
  110. // 任何整数按位异或上0结果不变
  111. // int result4 = 9 ^ 0 ;
  112. // 任何整数按位异或上另一个整数两次结果还是那个数
  113. // int result5 = 9 ^ 9 ^ 5;
  114. // int result6 = 9 ^ 5 ^ 9;
  115. // printf("result = %d\n", result6);
  116.  
  117. /*
  118. ~ 按位取反
  119. 特点: 0变1 1变0
  120.  
  121. 0000 0000 0000 0000 0000 0000 0000 1001
  122. ~1111 1111 1111 1111 1111 1111 1111 0110 (补码)
  123. 0000 0000 0000 0000 0000 0000 0000 0001
  124. ______________________________________________
  125. 1111 1111 1111 1111 1111 1111 1111 0101 (反码)
  126. 1000 0000 0000 0000 0000 0000 0000 1010
  127.  
  128. */
  129.  
  130. // int result = ~9;
  131. //// printf("result = %d\n", result);
  132. // printf("%d\n",0b11111111111111111111111111110110);
  133. return ;
  134.  
  135. }
  1. //
  2. // main.c
  3. // 位运算符2
  4. //
  5. // Created by xiaomage on 15/6/9.
  6. // Copyright (c) 2015年 itcast. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10.  
  11. int main(int argc, const char * argv[]) {
  12.  
  13. /*
  14. << 左移
  15.  
  16. a << n 把整数a的二进制位往左边移n位
  17. 移出的位砍掉,低位补0, 发现左移会把原有的数值变大
  18. 9 << 1 = 18 9 * 2(1) = 18
  19. 9 << 2 = 36 9 * 2(2) = 26
  20. 9 << n = 9 * 2(n)
  21. 左移的应用场景:当要计算某个数乘以2的n次方的时候就用左移,效率最高
  22.  
  23. 0000 0000 0000 0000 0000 0000 0000 0000
  24. 100 0000 0000 0000 0000 0000 0000 10010
  25.  
  26. 注意点:左移有可能改变数值的正负性
  27. */
  28.  
  29. /*
  30.  
  31. >> 右移
  32.  
  33. a >> n 把整数a的二进制位往右边移n位
  34. 移出的位砍掉, 缺少的以为最高位是0就补0是1就补1(是在当前操作系统下)
  35. 9 >> 1 = 4 9 / 2(1) = 4
  36. 9 >> 2 = 2 9 / 2(2) = 2
  37. 右移的应用场景:当要计算某个数除以2的N次方的时候就用右移,效率最高
  38. 0000 0000 0000 0000 0000 0000 0000 0000
  39. 000000 0000 0000 0000 0000 0000 0000 10
  40.  
  41. */
  42. // int result = 9 << 2;
  43. int result = >> ;
  44. printf("result = %d\n", result);
  45. return ;
  46. }
  1. //
  2. // main.c
  3. // 位运算符练习1
  4. //
  5. // Created by xiaomage on 15/6/9.
  6. // Copyright (c) 2015年 itcast. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10.  
  11. void printBinay(int value);
  12.  
  13. int main(int argc, const char * argv[]) {
  14. /*
  15. 要求定义一个函数, 传入一个整数, 输出该整数的二进制
  16. %i %o %x
  17.  
  18. 0000 0000 0000 0000 0000 0000 0000 1001
  19. &0000 0000 0000 0000 0000 0000 0000 0001
  20.  
  21. // 1.让9的二进制向右移31, 就可以获取到9得最高位的二进制, 然后让9的二进制的最高位和1相&, 那么就可以获得9的最高位
  22. // 2.让9的二进制向右移30, 就可以获得9二进制的第二位
  23. // 3.以此类推, 直到0位置
  24.  
  25. 技巧:
  26. 1.任何数与1相&都是那个数
  27. 2.利用位移取出每一位
  28. */
  29. int num = ;
  30. printBinay(num);
  31. return ;
  32. }
  33. void printBinay(int value)
  34. {
  35. // 1.定义变量需要向右移动的位数
  36. int offset = ;
  37. // 2.通过循环取出每一位
  38. while (offset >=) {
  39. int result = (value >> offset) & ;
  40. printf("%i", result);
  41. // 3.每次取出一位就让控制右移的变量-1
  42. offset--;
  43. if ((offset+) % == ) {
  44. printf(" ");
  45. }
  46. }
  47. printf("\n");
  48. }
  1. //
  2. // main.c
  3. // 位运算符练习2
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[]) {
  8. // 利用位运算符, 判断一个数的奇偶性
  9. int num = ;
  10.  
  11. // 开发中常用的方式
  12. if (num % == ) {
  13. printf("偶数\n");
  14. }else
  15. {
  16. printf("奇数\n");
  17. }
  18.  
  19. // 注意: 三目(三元)运算符, 的结果A和结果B如果是表达式, 那么必须有返回值
  20. (num % == ) ? printf("偶数\n"):printf("奇数\n");
  21.  
  22. int length = printf("李");
  23. printf("------%i\n", length);
  24.  
  25. /*
  26. 1001 9
  27. 1011 11
  28.  
  29. 1010 10
  30. 1100 12
  31. 通过观察, 我们发现如果是偶数, 那么二进制的最后一位是0, 如果是奇数那么二进制的最后一位是1
  32. */
  33. /*
  34. if ((num & 1) == 1)
  35. {
  36. printf("奇数\n");
  37. }else
  38. {
  39. printf("偶数\n");
  40. }
  41. */
  42.  
  43. if ((num & ))
  44. {
  45. printf("奇数\n");
  46. }else
  47. {
  48. printf("偶数\n");
  49. }
  50. return ;
  51. }
  1. //
  2. // main.c
  3. // 变量的存储细节
  4. //
  5. // Created by xiaomage on 15/6/9.
  6. // Copyright (c) 2015年 itcast. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10.  
  11. int main(int argc, const char * argv[]) {
  12. // 变量为什么要有类型? 每种类型占用的内存空间不一样 int 4, char 1 double 8
  13. // 只要定义变量, 系统就会开辟一块存储空间给我们的变量存储数据, 内存寻址是从大到小
  14. // 越先定义的变量, 内存地址越大
  15. // 变量的地址就是所占的存储空间最小的字节地址
  16.  
  17. int num;
  18. // 注意: 由于内存寻址是从大到小, 所以存储数据也是从大到小的存储(先存储二进制的高位, 再存储低位)
  19. // 高位 --> 低位
  20. // 00000000 00000000 00000000 00001001
  21. num = ; // 9 -->二进制 -->存储(补码)
  22. int value;
  23. value = ; //00000000 00000000 00000010 01011000
  24. // %p是输出地址
  25. // &变量名称, 是取出变量的地址
  26. printf("num = %p\n", &num);
  27. printf("value = %p\n", &value);
  28.  
  29. // 获取存储的每一位
  30. char *c = &value;
  31. for (int i = ; i < sizeof(num); i++) {
  32. int result = c[i]; // 取出每个字节中存储的数据
  33. printf("%i\n", result);
  34. }
  35.  
  36. return ;
  37. }
  1. //
  2. // main.c
  3. // char基本概念
  4. //
  5. // Created by xiaomage on 15/6/9.
  6. // Copyright (c) 2015年 itcast. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10.  
  11. int main(int argc, const char * argv[]) {
  12.  
  13. // 研究的问题: char类型的变量在内存中是如何存储的?
  14. // char 1个字节
  15. int num;
  16. char charValue;
  17. charValue = 'a'; // 计算机智能识别0和1
  18. // a == 97 == 01100001
  19. int size = sizeof(charValue);
  20. printf("%i\n", size);
  21. printf("num = %p\n", &num);
  22. printf("char = %p\n", &charValue);
  23.  
  24. // 在C语言中, 不看怎么存, 只看怎么取
  25. printf("%c\n", charValue);
  26. printf("%i\n", charValue);
  27.  
  28. 字符6和数字6就是完全不相同的两个数
  29. char c1 = ; //
  30. char c2 = '';//
  31.  
  32. printf("%i\n", c1);
  33. printf("%i\n", c2);
  34.  
  35. // char类型在某些情况下可以当做整型来用
  36. // 如果对内存要求特别严格, 而且需要存储的整数不超过char类型的取值范围, 那么就可以使用char类型来代替int类型
  37. // -2(7)~2(7)-1 == -128 ~ 127
  38. char c = ; // 1000 0000
  39. printf("%i\n", c);
  40.  
  41. return ;
  42. }
  1. //
  2. // main.c
  3. // 类型说明符
  4.  
  5. #include <stdio.h>
  6. /*
  7. 类型说明符:
  8. 1.说明长度的(它可以用于修改类型所占用的存储空间的大小)
  9. short; short == short int == 2个字节 == %hi/ %hd
  10. long; long == long int == 8个字节 == %li / %ld
  11. long long; == long long int == 8个字节 == %lli / %lld
  12.  
  13. 用于说明数据类型, 一般情况下和int配合使用
  14.  
  15. 2.说明符号位(它可以用于修改符号位是否用于正负数)
  16. unsigned; 无符号 , 取值正数和零 == %u
  17. signed; 有符号, 默认就是有符号 , 取值 正数和零以及负数
  18.  
  19. 3.不同类型的说明符可以混合使用
  20. unsigned short
  21. signed long
  22. // 注意: 相同类型不能在一起使用
  23. unsigned signed
  24. */
  25. int main(int argc, const char * argv[]) {
  26.  
  27. // int == 4个字节 == -2(31)~2(31)-1
  28.  
  29. int num = ;
  30. printf("num = %i\n", num);
  31.  
  32. // int == 4个字节, long int == 8个字节 == -2(63)~2(63)-1
  33. long int num1 = ;
  34. printf("num1 = %li\n", num1);
  35.  
  36. // long int == long
  37. // 用%li 或者 %ld来输出long类型的数据
  38. // C语言中不看怎么存, 只看怎么取
  39. long num2 = ;
  40. printf("num2 = %li\n", num2);
  41.  
  42. // long long
  43. // 在64位变一下, 基本没区别, 但是如果是在32位就有区别
  44. // 32位下long占4个字节, long long 占8个字节
  45. // 注意: 如果使用long long修饰变量, 那么输出的时候需要使用%lli或者%lld
  46. long long int num3 = ;
  47. printf("num3 = %lli\n", num3);
  48.  
  49. printf("long long = %i, long = %i\n", sizeof(num3), sizeof(num2));
  50.  
  51. // long long int == long long
  52. long long num4 = ;
  53. printf("num4 = %lli\n", num4);
  54.  
  55. // int == 4个字节 == -2(31)~2(31)-1
  56. int num = ; // 0000 1001
  57. printf("num = %i\n", num);
  58.  
  59. // 如果以后需要保存的数据的取值范围没有超过short int的取值范围, 可以使用short int来保存
  60. // 但是在企业级开发中很少使用
  61. // short int == 2个字节 == -2(15)~2(15)-1
  62. short int num1 = ;
  63. printf("num1 = %i\n", num1);
  64.  
  65. // short int == short
  66. // 如果要输出short int类型的数据, 可以使用%hi或者%hd
  67. short num2 = ;
  68. printf("num2 = %hi\n", num2);
  69.  
  70. printf("short = %i, int = %i\n", sizeof(num1), sizeof(num));
  71.  
  72. // signed 有符号
  73. // 如果给变量加上修饰符signed, 代表当前变量的取值可以是正数 / 负数/ 零
  74. // 如果给变量加上修饰符signed, 就代表把二进制的最高位作为符号位
  75. // 而且默认情况下所有变量都是有符号的(signed)
  76. signed int num = ; // 正数 / 负数/ 零 int == -2(31)~2(31)-1
  77. printf("num = %i\n", num);
  78.  
  79. // unsigned 代表无符号. 无符号就代表当前变量的取值只能是正数 / 零
  80. // 如果给变量加上修饰符unsigned, 就代表"不"把二进制的最高位作为符号位
  81.  
  82. // 如果想打印无符号的变量, 只能用%u
  83. unsigned int num1 = -;
  84. printf("num1 = %u", num1);
  85.  
  86. // 不同类型的说明符可以混合使用
  87. unsigned long int num = ;
  88. printf("num = %lu\n", num);
  89.  
  90. signed short int num1 = ;
  91. printf("num1 = %hi\n", num1);
  92.  
  93. // 注意: 相同类型的说明符不能同时在一起使用
  94. // short long int num2 = 998;
  95. // unsigned signed int num3 = 998;
  96.  
  97. return ;
  98. }

c11---位运算相关的更多相关文章

  1. N皇后问题(位运算实现)

    本文参考Matrix67的位运算相关的博文. 顺道列出Matrix67的位运算及其使用技巧 (一) (二) (三) (四),很不错的文章,非常值得一看. 主要就其中的N皇后问题,给出C++位运算实现版 ...

  2. C++基础-位运算

    昨天笔试遇到一道题,让实现乘法的计算方法,设计方案并优化,后来总结位运算相关知识如下: 在计算机中,数据是以1010的二进制形式存储的,1bytes = 8 bits,bit就是位,所以位运算就是对每 ...

  3. JAVA基础1——字节&位运算

    占用字节数 & 取值范围 Java一共有8种基本数据类型(原始数据类型): 类型 存储要求 范围(包含) 默认值 包装类 int 4字节(32位) -2^31~ 2^31-1 0 Intege ...

  4. c#位运算基本概念与计算过程

    前言 一些非常基础的东西,在实际工作中没有用到.很少用到.一旦遇到,又不知所云.最近遇到一个问题,把一个int16(short) .两个bool变量整合成一个int32(int),当听到这个要求时,我 ...

  5. #C语言初学记录(位运算)

    位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由 ...

  6. C 碎片九 预处理&位运算&文件操作

    一.预处理 预处理语句:#开头的语句,在预处理阶段处理预处理语句.包括宏定义.文件包含处理.条件编译 1, 宏定义 1. 不带参数宏定义:#define 标识符  字符串 #define PI 3.1 ...

  7. 【BZOJ3668】[NOI2014] 起床困难综合症(位运算思想)

    点此看题面 大致题意: 给定一些位运算操作,让你在\(0\sim m\)范围内选一个初始值,使其在经过这些运算后得到的结果最大. 前置技能:关于位运算 作为一道位运算的题,如果你不知道什么是位运算,那 ...

  8. 剑指offer用位运算实现两个数相加,及python相关的位操作

    题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution:    def Add(self ...

  9. C#位运算讲解与示例

    首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: p ...

  10. BZOJ-3668 起床困难综合症 位运算+贪心

    faebdc学长杂题选讲中的题目...还是蛮简单的...位运算写的不熟练... 3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec Memory Limit: 512 ...

随机推荐

  1. Excel数据迁移到SQL Server遇到的若干问题

    系统环境为:Windows Server 2008 r2 SQL Server 2012 1.建表过程中,如果用图形化的方式修改表结构会遇到问题: '不允许保存更改.您所做的更改要求删除并重新创建以下 ...

  2. C# 添加应用程序包

    项目中可能会遇到某些扩展方法不可以应用的情况,这时候需要在项目中引用程序包 步骤如下: 回车即可

  3. (转)vue router 如何使用params query传参,以及有什么区别

    写在前面: 传参是前端经常需要用的一个操作,很多场景都会需要用到上个页面的参数,本文将会详细介绍vue router 是如何进行传参的,以及一些小细节问题.有需要的朋友可以做一下参考,喜欢的可以点波赞 ...

  4. [原创]C++带空格字符串的输入问题

    字符串一直是一个重点加难点,很多笔试面试都会涉及,带空格的字符串更是十分常见,现在对字符串的输入问题进行一下总结. C++用cin输入的时候会忽略空格以后的字符,比如 char a[100]; cin ...

  5. H5 微信公众号 监听返回事件

    /*-----监听返回事件-----*/ function pushHistory(returnUrl,currentUrl,currentTitle) { window.addEventListen ...

  6. 【Oracle】RAC集群中的命令

    数据库名称:racdb 节点名称:rac3.rac4 注:以下命令均在grid用户中执行 1.查看集群节点的状态: [grid@rac3 ~]$ crsctl check cluster [grid@ ...

  7. 参数转对象 类似 ?camera=1&travel=0&faceScore=1

    parseQueryString(url) { var obj = {}; var keyvalue = []; var key = "", value = "" ...

  8. 计算机二级考试Access教程

    本教程对编程语言各种要点进行详细的讲解介绍,从基础知识到实用技术功能,内容涵盖了从数组,类等基本概念到多态.模板等高级概念.教程本着实用的原则,每一小节都结合了可以笔试.面试的常见程序实例,以便从第一 ...

  9. 【从零开始】【Java】【0】装软件些

    闲聊 其实最先写的是1,所以拐回头写的只能是0了. 因为要在不同的电脑上搞这个东西,必然涉及到装机,当然只是装我们用的这些,且是最基础的部分了. 大晚上的睡不着觉,起来,大概1个小时全部搞定,随便记下 ...

  10. <轉>APUE:mmap函数

    起初 看过一遍内存映射I/O,意思大概是懂了,就是直接操作文件再而直接通过缓冲区来操作,减少一些read.write调用所花费的时间.加上文中给出一个copy的例子,意思也好理解的.不过困扰的来了,我 ...