1G=1024M;

1M=102KB;

1KB=1024B(字节);

1B=8bits(位);

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. //C语言中的逻辑运算符
  5. //逻辑与(&&);逻辑或(||);逻辑非(!)。
  6.  
  7. //强调逻辑运算符与位逻辑运算符不同
  8.  
  9. //C语言中的位运算符有以下两类:
  10. //位逻辑运算符:&(位“与”)、^(位“异或”)、 | (位“或”)、~(位“取反”)。
  11. //移位运算符: << (左移)、 >> (右移)
  12. void main(){
  13. //一:取反运算(~)
  14. unsigned char ch1 = ;
  15. //一个字符有8位,ch1换算成二进制是 1010 0101
  16. //位取反的操作符为“~”,
  17. //即每位都取反,0变成1,1变成0,需要注意的是,位取反运算并不改变操作数的值。
  18. //那么~ch1=0101 1010,换算成十进制是90
  19. unsigned char ch2 = ~ch1;
  20. //printf("\n%d", ~ch1);// 打印 -166 错误 解释: ~ch1是取反运算,值会存储在cpu的寄存器中,所以printf函数不确定~ch1的类型
  21. printf("\n取反运算%d", (unsigned char)~ch1);// 打印 90 正确
  22. printf("\n取反运算%d",ch2);// 打印 90 正确
  23.  
  24. //二:与运算(&)----清零
  25. //位与运算的操作符为&,将对两个操作数的每一位
  26. //进行与运算,位“与”运算的准则如下:(两者都为1的时候才是1,有一个为0就是0)
  27. //1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0
  28. unsigned char ch3 = ;
  29. //ch1 1010 0101
  30. //ch3 0000 1111
  31. //ch1&ch3 0000 0101 十进制是5
  32. unsigned char ch4 = ch1&ch3;
  33. printf("\n与运算%d", ch4);// 打印 5 正确
  34. //对于ch1&ch3的分析,发现与运算可以用来"保持一部分位不变(不变用1),部分为全部为0(变0用0)"
  35.  
  36. //三:或运算(|)---置1
  37. //位或运算的操作符为|,将对两个操作数的每一位进行或运算,位“或”运算的准则如下:(两者有一个是1就是1,两者都为0才是0)
  38. //1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0
  39. //例子
  40. //ch1 1010 0101
  41. //ch3 0000 1111
  42. //ch1|ch3 1010 1111 十进制是175
  43. unsigned char ch5 = ch1|ch3;
  44. printf("\n或运算%d", ch5);// 打印 175 正确
  45. //对于ch1|ch3的分析,发现与运算可以用来"保持一部分位不变(不变用0),部分为全部为1(变1用1)"
  46.  
  47. //四:异或运算(^)---取反
  48. //位或运算的操作符为^,将对两个操作数的每一位进行异或运算。
  49. //通俗地讲,如果位“异或”运算的两个位相同(同为0或同为1),结果为0,
  50. //若两个位不同(一个为0,另一个为1),结果为1,对应的准则为:(两者相同结果是0,两者不同结果是1)
  51. //1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0
  52. //例子
  53. //ch1 1010 0101
  54. //ch3 0000 1111
  55. //ch1^ch3 1010 1010 十进制170
  56. unsigned char ch6 = ch1^ch3;
  57. printf("\n异或运算%d", ch6);// 打印 170 正确
  58. //对于ch1^ch3的分析,发现与运算可以用来"保持一部分位不变(不变用0),部分取反(取反用1)"
  59.  
  60. //五:左移运算(<<)
  61. //A称为操作数,其必须为数字型变量或数字型常量,
  62. //此处的数字型包括整型、浮点型和char型,A中存储的0、1序列向左或右移动n位,
  63. //移动后的值作为整个表达式的输出,执行移位运算并不改变操作数A的值。
  64. unsigned char ch7 = ;
  65. //例子
  66. //ch7 0000 0001 十进制是1
  67. //ch7<<1 0000 0010 十进制是2 (1*2)
  68. //ch7<<2 0000 0100 十进制是4 (2*2)
  69. unsigned char ch8 = ch7<<;
  70. unsigned char ch9 = ch7<<;
  71. printf("\n左移运算ch7<<1=%d", ch8);// 打印 2 正确
  72. printf("\n左移运算ch7<<2=%d", ch9);// 打印 4 正确
  73. unsigned char cha = ;
  74. //例子
  75. //cha 1000 0000 十进制是128
  76. //cha<<1 0000 0000 十进制是0
  77. unsigned char chb = cha << ;
  78. printf("\n左移运算cha<<1=%d", chb);// 打印 0 正确
  79.  
  80. //六:右移运算(>>)
  81. unsigned char chc = ;
  82. //例子
  83. //chc 1111 1111 十进制是255
  84. //chc>>1 0111 1111 十进制是127 (255/2)
  85. //chc>>2 0011 1111 十进制是63 (127/2)
  86. unsigned char chd = chc >> ;
  87. unsigned char che = chc >> ;
  88. printf("\n右移运算chc >> 1=%d", chd);// 打印 127 正确
  89. printf("\n右移运算chc >> 2=%d", che);// 打印 63 正确
  90.  
  91. //练习
  92. // 1010 0101十进制是165
  93. //练习1:前四位不变,后四位清零
  94. //分析:清零操作使用与运算符;前四位不变1111,后四位清零0000,二进制是1111 0000---十进制是240
  95. unsigned char chf = ;
  96. unsigned char chg = ch1&chf;
  97. //ch1 1010 0101 十进制是165
  98. //chf 1111 0000 十进制是240
  99. //ch1&chf 1010 0000 十进制是160
  100. printf("\n前四位不变,后四位清零%d", chg);// 打印 160 正确
  101.  
  102. //练习2:前四位不变,后四位置1
  103. //分析:置1使用或运算符,前四位不变--0000,后四位置1--1111,二进制是 0000 1111---十进制是15
  104. unsigned char chh = ;
  105. unsigned char chi = ch1 | chh;
  106. //ch1 1010 0101 十进制是165
  107. //chh 0000 1111 十进制是15
  108. //ch1|chf 1010 1111 十进制是175
  109. printf("\n前四位不变,后四位置1--%d", chi);// 打印 175 正确
  110.  
  111. //练习3:前四位不变,后四位取反
  112. //分析:取反有2中方法,取反运算符和异或运算符,取反运算符只能全部取反,异或运算符可以部分取反
  113. //前四位不变,说明只能使用异或运算符;前四位不变0000;后四位取反1111,二进制是 0000 1111---十进制是15
  114. //注:异或相同为0,不同为1,两个0的值仍然是0,两个1的值是0,一个0和一个1结果是1
  115. unsigned char chj = ch1^chh;
  116. //ch1 1010 0101 十进制是165
  117. //chh 0000 1111 十进制是15
  118. //ch1|chf 1010 1010 十进制是170
  119. printf("\n前四位不变,后四位取反--%d", chj);// 打印 170 正确
  120.  
  121. system("pause");
  122. }
           在C语言的位运算中,左移也就是所说的逻辑移位,右端补0,而右移是算数移位,左端补齐的是最高位的符号位。因此负数左移,有可能变成正数
,但负数右移,肯定还是负数。

特别注意,这是运算的变量是有符号类型的情况,如果是无符号类型,就算最高位是1,那么左移填充的符号位依然是0。

  1. 位运算注意点
  2. 在进行位运算时,要求所有参与运算变量必须是 unsigned char类型,这是因为正数和负数在内存中都是以补码方式存储
  3. 如果使用char,这是有符号的类型,那么如果这个char小于0,那么在内存中的存储就会变化,当出现拷贝操作时,就会改变原数据
  4. 如果使用unsigned char,所有的数据都是正数(正数的原码,补码一致),拷贝时,系统就不会修改原数据了

C语言 位运算的更多相关文章

  1. C语言位运算

    C语言位运算详解    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...

  2. C语言位运算+实例讲解(转)

    按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...

  3. C语言位运算详解[转]

    作者:911 说明:本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/,算是对其的修正,在此将本文列为原创,实有抄袭之嫌疑.甚是惭愧! 位运算是指按二 ...

  4. C语言位运算详解

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整形操作数,即只能用于带符号或无符号的char.short.int与long类型 ...

  5. C语言位运算详解(转载)

    转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C ...

  6. C 语言 ----位运算

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作 运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类 ...

  7. C语言位运算、移位运算 经典示例

    概述: C语言的位级运算可以运用到任何“整数”的数据类型上,如char.short.int.long.long long.或者unsigned这样的限定词.基本的位运算有与.或.非.异或等等. C语言 ...

  8. C语言位运算题解

    #include <stdio.h> #include <stdlib.h> #include <string.h> //#define NONBLANK 1 ma ...

  9. 嵌入式C语言位运算之清位置位

    如题,在嵌入式开发中,掌握位运算是节省开发时间和提高开发效率的一种高效方式. 我们不得不去熟悉如何快速掌握位运算这种高效的技巧,接下来看看程序.. #include <stdio.h> # ...

随机推荐

  1. OC语言-08-深拷贝与浅拷贝详解(示例)

    概述 拷贝:复制一个与源对象内容相同的对象 实现拷贝,需要遵守以下两个协议 NSCopying NSMutableCopying 拷贝返回对象的种类 可变,mutableCopy消息返回的对象 不可变 ...

  2. MJExtension简介

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. Saiku 下载,安装

    Saiku是一个模块化的开源分析套件,它提供轻量级的OLAP(联机分析处理),并且可嵌入.可扩展.可配置. 主页:http://community.meteorite.bi 如何安装摘自: http: ...

  4. java编程思想第四版中net.mindview.util包下载,及源码简单导入使用

    在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...

  5. python super

    http://hi.baidu.com/thinkinginlamp/item/3095e2f52c642516ce9f32d5 Python中对象方法的定义很怪异,第一个参数一般都命名为self(相 ...

  6. 用luke看索引

    Luke是一个用于Lucene搜索引擎的第三方工具,它可以访问现有Lucene的索引,并允许您显示和修改.可以看每篇文档建立了哪些索引,验证有没有成功建立了索引.不然建立了,不能确定有没有成功. 可以 ...

  7. js中 字符串与Unicode 字符值序列的相互转换

    一. 字符串转Unicode 字符值序列 var str = "abcdef"; var codeArr = []; for(var i=0;i<str.length;i++ ...

  8. hdu 4856 Tunnels (记忆化搜索)

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. 转载的vim配置文件

    """"""""""""""""&quo ...

  10. apache配置虚拟目录

    #虚拟目录配置 <IfModule dir_module> DirectoryIndex index.html index.htm index.php Alias /htdocs &quo ...