A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


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,则根据不同的计算机系统,可能有不同的处理方式


2 个回复

正序浏览
刘晓良 发表于 2015-7-3 17:01
上面我也有点疑惑

其实这里没有什么好疑惑的;
以下个人愚见:
疑惑大多来自以前的知识和现在刚学习的知识之间的那个 冲击。
不能用 十进制的思想去理解二进制  十进制思想的固化,对于二进制的本能排斥;
刚开始学习 1+1=2的时候,我们什么都没想,99加减法表每天背、
半学期学加减,半学期学乘除,现在没有那么长时间慢慢接受;
这跟我们刚 学习1+1 的时候其实差别就在 这个1111111111111111111比较长……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马