黑马程序员技术交流社区
标题:
C语言学习笔记:位运算及典型运用
[打印本页]
作者:
弥修斯
时间:
2015-7-3 16:09
标题:
C语言学习笔记:位运算及典型运用
1. & 按位与
1) 运算规则 (同1为1,有0为0)
位与运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑与运算。例如:
int型常量4和7进行位与运算的运算过程如下:
4=0000 0000 0000 0100 &7 =0000 0000 0000 0111= 0000 0000 0000 0100
对于负数,按其补码进行运算。例如:int型常量-4和7进行位与运算的运算过程如下:
-4=1111 1111 1111 1100 &7 =0000 0000 0000 0111= 0000 0000 0000 0100
2) 运用
(1) 清零 :快速对某一段数据单元的数据清零,即将其全部的二进制位为0。例如整型数a=321对其全部数据清零的操作:
321=0000 0001 0100 0001 &0=0000 0000 0000 0000= 0000 0000 0000 0000
(2) 获取一个数的最低位:让这个数与1进行按位&操作;例如:
int c=6;
……0000 0110
& ……0000 0001
--------------------------
……0000 0000
有0为0 同1为1
result=0,即c=6 的最低位;
2. | 按位或
1) 运算规则 (有1为1,同0为0)
位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。
例如:int型常量5和7进行位或运算的表达式为5|7,结果如下:
5= 0000 0000 0000 0101 | 7= 0000 0000 0000 0111=0000 0000 0000 0111
逻辑运算符|| 与按位或运算符 |的区别 :
条件“或”运算符 (||) 执行 bool 操作数的逻辑“或”运算,但仅在必要时才计算第二个操作数。
x || y , x | y 不同的是,如果 x 为 true,则不计算 y(因为不论 y 为何值,“或”操作的结果都为 true)。
这被称作为“短路”计算。
3. ^ 按位异或
1) 运算规则 (相同为0,不同为1)
位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进制数互斥的时候,对应位的结果才为真。
例如:int型常量5和7进行位异或运算的表达式为5^7,结果如下:
5=0000 0000 0000 0101^7=0000 0000 0000 0111 = 0000 0000 0000 0010
(1)定位翻转 :
设定一个数据的指定位,将1换为0,0换为1
(2)数值交换 :
例如a=3,b=4。在例11-1中,无须引入第三个变量,利用位运算即可实现数据交换。以下的操作可以实现a,b两个数据的交换:
a=a^b;
b=b^a;
a=a^b;
4.~ 按位取反
1) 运算规则 (1变0,0变1)
位非运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑非运算。
{疑问点记录:
~9(10):
~00000000 00000000 00000000 0000 100 = 11111111 11111111 11111111 1111 0110 (老师说这个(1111……0110)是补码。按位取反得到的是补码吗?源码的反码是不是就是按位取反?)
}
二.位移运算符
左位移 <<;
右位移 >> ;
1、左位移:将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃。例如:
int a,b;
a=5;
b=a<<2;
则b=20,分析过程如下:
(a)10=(5)10=(0000 0000 0000 0101)2
b=a<<2;
b=(0000 0000 0001 0100)2=(20)10
2、右位移:将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数,高位补零。例如:
int (a)10=(5)10=(0000 0000 0000 0101)2
b=a>>2;
b=(0000 0000 0000 0001)2=(1)10
1) 运用
(1)
把一个10进制数输出为按照二进制格式:右位移32次,位移之后与1进行按位与 (n>>i)&1,得出最低位(按位与原理)
。例如:
int n=13
for(i = 0; i<32; i++){
n=n>>(31-i);
//把第一位移到最后一位,和1进行 按位与
int x=n&1;
printf("%d",x);
}
输出:……1101;
如果当前的数据为有符号数,在进行右移的时候,根据符号位决定左边补0还是补1。
如果符号位为0,则左边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式
作者:
弥修斯
时间:
2015-7-4 14:59
刘晓良 发表于 2015-7-3 17:01
上面我也有点疑惑
其实这里没有什么好疑惑的;
以下个人愚见:
疑惑大多来自以前的知识和现在刚学习的知识之间的那个 冲击。
不能用 十进制的思想去理解二进制 十进制思想的固化,对于二进制的本能排斥;
刚开始学习 1+1=2的时候,我们什么都没想,99加减法表每天背、
半学期学加减,半学期学乘除,现在没有那么长时间慢慢接受;
这跟我们刚 学习1+1 的时候其实差别就在 这个1111111111111111111比较长……
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2