黑马程序员———C语言———【按位运算】

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、进制中的转换

#include <stdio.h>
#include <stdlib.h>

void main()
{
    //定义一个int类型的数字13,分别打印出8进制和16进制的数
    int num=13;
    printf("%o\n",num);     //15
    printf("%x\n",num);     //d

    //将2进制的数据转换为10进制
    printf("%d\n",0b0101);  //5
    
    //将16进制的数据转换为10进制
    printf("%d\n",0xd);     //13
    
    //将8进制的数据转换为10进制
    printf("%d\n",015);     //13
}

二、进制转换的要素


基数:是几进制基数就是几。

位权:位权=数码*基数^数位次方


三、10进制和2进制互相转换

转换方法:整数部分采取“除2取余法”,小数部分采取“乘2取整法”,高位补0,将得到的余数倒叙得到的序列就是二进制表示形式。

(1)例如:将10进制的97转换为2进制的数据

2)例如:将2进制的0b0011转换为10进制的数据

2*1^0+2*1^1=3


四、2进制和16进制互相转换

2进制->16进制转换方法:整数部分从右向左并一位,小数部分从左向右并一位

16进制->2进制转换方法:1位拆4位

实例2:

将一个16进制常量转换为2进制方法

16进制常量为0x520A

5  --->   0101

2  --->   0010

0  --->   0000

A  --->   1010

2进制就为:0101 0010 0000 1010

如果拆完之后位数不够,高位补0.


五、原码、反码、补码

1、概念及使用

数据在计算机内部是以补码的形式存储的。

(1)原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。

2)反码:正数的反码是其本身。负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

(3)补码:正数的补码是其本身。负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1

综上:

[+1] = [00000001] 原码 = [00000001] 反码 = [00000001] 补码

[-1]  = [10000001] 原码 = [11111110] 反码 = [11111111] 补码

64位机器下:

int 类型占用4个字节,每个字节8位

计算机存储1使用32位的二进制数码,存储的是补码。

(1)+1 存储的是补码

原码:00000000000000000000000000000001

反码:原码

补码:原码

(2)-1存储的是补码

原码:10000000000000000000000000000001

反码:11111111111111111111111111111110

补码:11111111111111111111111111111111

2、为什么引入反码、补码?

计算机能够做减法。


六、位运算符

1、&按位与:如果两个位进行&操作,同1则结果为1,有0即为0

2、| 按位或:如果两个位进行 | 操作,有1则为1,同0即为0

3、~ 按位取反:1变0,0变1如:~9

4、^ 按位异或:相同为0,不同为1

5、左移<<:各二进位全部左移n位,高位丢弃,低位补0

例如:8<<2 相当于8*2^n的次方

注意:左移位会改变一个数的正负性

用途:快速计算一个数 * 2的n次方

6、右移>>:移动出去的位舍弃,高位补符号位

例如:8>>2 相当于8/2^n的次方

注意:右移位不会改变一个数的正负性

用途:快速计算一个数 / 2的n次方

7、位运算技巧

任何数和1进行&操作,得到这个数的最低位,然后判断奇偶性

<span style="white-space:pre">	</span>#include <stdio.h>
<span style="white-space:pre">	</span>#include <stdlib.h>

<span style="white-space:pre">	</span>void main()
<span style="white-space:pre">	</span>{
    <span style="white-space:pre">		</span>//奇数
    <span style="white-space:pre">		</span>int a=5;
    <span style="white-space:pre">		</span>printf("最低位是:%d",a&1);  //1
    
    <span style="white-space:pre">		</span>//偶数
    <span style="white-space:pre">		</span>int a=6;
    <span style="white-space:pre">		</span>printf("最低位是:%d",a&1);  //0
    
    <span style="white-space:pre">		</span>printf("如果是1就是奇数,如果是0就是偶数");
<span style="white-space:pre">	</span>}

七、练习:将一个10进制的数用二进制的形式打印出来。

<span style="white-space:pre">	</span>#include <stdio.h>
<span style="white-space:pre">	</span>#include <stdlib.h>

<span style="white-space:pre">	</span>void main()
<span style="white-space:pre">	</span>{
    <span style="white-space:pre">		</span>int num=13;
   <span style="white-space:pre">		</span>int len=sizeof(int)*8;
   <span style="white-space:pre">		</span>int r1,r2,r3;
   <span style="white-space:pre">		</span>for(int i=len-1;i>=0;i--){
      <span style="white-space:pre">			</span>r1=num>>i;
      <span style="white-space:pre">			</span>r2=r1&1;
       <span style="white-space:pre">			</span>printf("%d",r2);
   <span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}<span style="white-space:pre">	</span>

解析:

13的二进制表示形式是:00000000000000000000000000001101

1的二进制表示形式是  :00000000000000000000000000000001

让13的二进制数从左到右依次与1的二进制最后一位做&,得到的就是13的二进制表现形式

                                                                       ← 逐个向左移动

00000000000000000000000000001101

00000000000000000000000000000001

逐个打印的出的还是:00000000000000000000000000001101


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值