C语言 位运算
1G=1024M;
1M=102KB;
1KB=1024B(字节);
1B=8bits(位);
#include<stdio.h>
#include<stdlib.h> //C语言中的逻辑运算符
//逻辑与(&&);逻辑或(||);逻辑非(!)。 //强调逻辑运算符与位逻辑运算符不同 //C语言中的位运算符有以下两类:
//位逻辑运算符:&(位“与”)、^(位“异或”)、 | (位“或”)、~(位“取反”)。
//移位运算符: << (左移)、 >> (右移)
void main(){
//一:取反运算(~)
unsigned char ch1 = ;
//一个字符有8位,ch1换算成二进制是 1010 0101
//位取反的操作符为“~”,
//即每位都取反,0变成1,1变成0,需要注意的是,位取反运算并不改变操作数的值。
//那么~ch1=0101 1010,换算成十进制是90
unsigned char ch2 = ~ch1;
//printf("\n%d", ~ch1);// 打印 -166 错误 解释: ~ch1是取反运算,值会存储在cpu的寄存器中,所以printf函数不确定~ch1的类型
printf("\n取反运算%d", (unsigned char)~ch1);// 打印 90 正确
printf("\n取反运算%d",ch2);// 打印 90 正确 //二:与运算(&)----清零
//位与运算的操作符为&,将对两个操作数的每一位
//进行与运算,位“与”运算的准则如下:(两者都为1的时候才是1,有一个为0就是0)
//1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0
unsigned char ch3 = ;
//ch1 1010 0101
//ch3 0000 1111
//ch1&ch3 0000 0101 十进制是5
unsigned char ch4 = ch1&ch3;
printf("\n与运算%d", ch4);// 打印 5 正确
//对于ch1&ch3的分析,发现与运算可以用来"保持一部分位不变(不变用1),部分为全部为0(变0用0)" //三:或运算(|)---置1
//位或运算的操作符为|,将对两个操作数的每一位进行或运算,位“或”运算的准则如下:(两者有一个是1就是1,两者都为0才是0)
//1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0
//例子
//ch1 1010 0101
//ch3 0000 1111
//ch1|ch3 1010 1111 十进制是175
unsigned char ch5 = ch1|ch3;
printf("\n或运算%d", ch5);// 打印 175 正确
//对于ch1|ch3的分析,发现与运算可以用来"保持一部分位不变(不变用0),部分为全部为1(变1用1)" //四:异或运算(^)---取反
//位或运算的操作符为^,将对两个操作数的每一位进行异或运算。
//通俗地讲,如果位“异或”运算的两个位相同(同为0或同为1),结果为0,
//若两个位不同(一个为0,另一个为1),结果为1,对应的准则为:(两者相同结果是0,两者不同结果是1)
//1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0
//例子
//ch1 1010 0101
//ch3 0000 1111
//ch1^ch3 1010 1010 十进制170
unsigned char ch6 = ch1^ch3;
printf("\n异或运算%d", ch6);// 打印 170 正确
//对于ch1^ch3的分析,发现与运算可以用来"保持一部分位不变(不变用0),部分取反(取反用1)" //五:左移运算(<<)
//A称为操作数,其必须为数字型变量或数字型常量,
//此处的数字型包括整型、浮点型和char型,A中存储的0、1序列向左或右移动n位,
//移动后的值作为整个表达式的输出,执行移位运算并不改变操作数A的值。
unsigned char ch7 = ;
//例子
//ch7 0000 0001 十进制是1
//ch7<<1 0000 0010 十进制是2 (1*2)
//ch7<<2 0000 0100 十进制是4 (2*2)
unsigned char ch8 = ch7<<;
unsigned char ch9 = ch7<<;
printf("\n左移运算ch7<<1=%d", ch8);// 打印 2 正确
printf("\n左移运算ch7<<2=%d", ch9);// 打印 4 正确
unsigned char cha = ;
//例子
//cha 1000 0000 十进制是128
//cha<<1 0000 0000 十进制是0
unsigned char chb = cha << ;
printf("\n左移运算cha<<1=%d", chb);// 打印 0 正确 //六:右移运算(>>)
unsigned char chc = ;
//例子
//chc 1111 1111 十进制是255
//chc>>1 0111 1111 十进制是127 (255/2)
//chc>>2 0011 1111 十进制是63 (127/2)
unsigned char chd = chc >> ;
unsigned char che = chc >> ;
printf("\n右移运算chc >> 1=%d", chd);// 打印 127 正确
printf("\n右移运算chc >> 2=%d", che);// 打印 63 正确 //练习
// 1010 0101十进制是165
//练习1:前四位不变,后四位清零
//分析:清零操作使用与运算符;前四位不变1111,后四位清零0000,二进制是1111 0000---十进制是240
unsigned char chf = ;
unsigned char chg = ch1&chf;
//ch1 1010 0101 十进制是165
//chf 1111 0000 十进制是240
//ch1&chf 1010 0000 十进制是160
printf("\n前四位不变,后四位清零%d", chg);// 打印 160 正确 //练习2:前四位不变,后四位置1
//分析:置1使用或运算符,前四位不变--0000,后四位置1--1111,二进制是 0000 1111---十进制是15
unsigned char chh = ;
unsigned char chi = ch1 | chh;
//ch1 1010 0101 十进制是165
//chh 0000 1111 十进制是15
//ch1|chf 1010 1111 十进制是175
printf("\n前四位不变,后四位置1--%d", chi);// 打印 175 正确 //练习3:前四位不变,后四位取反
//分析:取反有2中方法,取反运算符和异或运算符,取反运算符只能全部取反,异或运算符可以部分取反
//前四位不变,说明只能使用异或运算符;前四位不变0000;后四位取反1111,二进制是 0000 1111---十进制是15
//注:异或相同为0,不同为1,两个0的值仍然是0,两个1的值是0,一个0和一个1结果是1
unsigned char chj = ch1^chh;
//ch1 1010 0101 十进制是165
//chh 0000 1111 十进制是15
//ch1|chf 1010 1010 十进制是170
printf("\n前四位不变,后四位取反--%d", chj);// 打印 170 正确 system("pause");
}
特别注意,这是运算的变量是有符号类型的情况,如果是无符号类型,就算最高位是1,那么左移填充的符号位依然是0。

位运算注意点
在进行位运算时,要求所有参与运算变量必须是 unsigned char类型,这是因为正数和负数在内存中都是以补码方式存储
如果使用char,这是有符号的类型,那么如果这个char小于0,那么在内存中的存储就会变化,当出现拷贝操作时,就会改变原数据
如果使用unsigned char,所有的数据都是正数(正数的原码,补码一致),拷贝时,系统就不会修改原数据了
C语言 位运算的更多相关文章
- C语言位运算
C语言位运算详解 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...
- C语言位运算+实例讲解(转)
按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...
- C语言位运算详解[转]
作者:911 说明:本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/,算是对其的修正,在此将本文列为原创,实有抄袭之嫌疑.甚是惭愧! 位运算是指按二 ...
- C语言位运算详解
位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整形操作数,即只能用于带符号或无符号的char.short.int与long类型 ...
- C语言位运算详解(转载)
转载自:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C ...
- C 语言 ----位运算
位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作 运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类 ...
- C语言位运算、移位运算 经典示例
概述: C语言的位级运算可以运用到任何“整数”的数据类型上,如char.short.int.long.long long.或者unsigned这样的限定词.基本的位运算有与.或.非.异或等等. C语言 ...
- C语言位运算题解
#include <stdio.h> #include <stdlib.h> #include <string.h> //#define NONBLANK 1 ma ...
- 嵌入式C语言位运算之清位置位
如题,在嵌入式开发中,掌握位运算是节省开发时间和提高开发效率的一种高效方式. 我们不得不去熟悉如何快速掌握位运算这种高效的技巧,接下来看看程序.. #include <stdio.h> # ...
随机推荐
- Android 优秀的开源框架整理
第一部分:系统架构 thinkAndroid https://github.com/white-cat/ThinkAndroid ThinkAndroid是一个免费的开源的.简易的.遵循Apache2 ...
- 在Android开发中使用Ant 三:批量打包
批量打包最常用到的地方是进行产品推广时,为每个渠道打一个包.上一篇随笔中,介绍了怎样进行一次完整的打包,批量打包只要在此基础上做一次循环即可. 在打包之前要做两个准备工作,一个是读取渠道,一个是修改存 ...
- 【读书笔记】iOS-UIFont-如何知道字体的PostScript名称
一,名词解释 PostScript字体: 按 PostScript 页面描述语言 (PDL) 规则定义的字体,并且只能在 PostScript 兼容的打印机上打印. 二,打开Launchpad---- ...
- IOS开发支付宝集成
开发准备 1.首先新建项目,然后去官网下载最新的开发包:http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&am ...
- Android源码分析之Message
准备开始写点东西,算是对自己阅读源码的一个记录/笔记,也希望能对同样感兴趣的人有所帮助,希望能坚持下去,加油. 在Android的开发中,我们经常用到Handler.postXXX方法,或者View. ...
- 深入理解java虚拟机(3)---类的结构
计算机在开始的时候,只认识0和1,所以汇编语言是和机器结构或者说CPU绑定的.ARM体系结构就是这样一种体现,指令集的概念. 随着高级语言的出现,从字编码发展到了字节编码,计算机的先驱希望能够让语言能 ...
- 【AdaBoost算法】积分图代码实现
一.积分图介绍 定义:图像左上方的像素点值的和: 在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图: 二.代码实现 #include <opencv/highgui.h ...
- linux下修改系统时间
一.查看时间: [root@localhost ~]# date2016年 11月 19日 星期六 12:46:37 CST 二.修改时间,修改系统时间 [root@localhost ~]# dat ...
- 团队交流合作简单解决方案:TeamViewer远程控制&会议演示 + HyperCam屏幕录制(免费)
一. 教程摘要 做开发,团队合作是少不了的.而在合作中,有一部分是花在交流讨论上,其中包括初期的任务分配,成员的进度汇报,以及资源和心得分享等.该教程介绍了两个免费的软件,搭配起来,适合人数不超过25 ...
- 设计模式C#实现(八)——原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.(要创建一个对象,这个对象为实现原型接口,方法是原型克隆.克隆只是方法而不是原型模式的目的,创建对象才是目的) UML类图: ...