重温C语言七-----二进制与位运算

二进制与位运算

1)进制

  • 进制介绍:

    对于整数,有四种表示方式

    1. 二进制:0,1满2进1,C语言中没有二进制常数的表示方法。
    2. 十进制:0~9,满10进1.
    3. 八进制:0~7.满8进1,以数字0开头表示
    4. 十六进制09及AF,满16进1,此处A~F不区分大小写如:0x21AF=0x21B0
  • 举例

int num2=210;//十进制
int num3=01010;//八进制
int num4=0x1010//十六进制

2)进制之间的转换

第一组(其他进制转十进制)

  1. 二进制转十进制

    /*规则:从最低为开始,将个位上的数提取出来乘以2的(位数-1)次方,然后求和
    请将二进制1011转换为十进制的数
    */二进制 1011=1*2^0+1*2^1+0*2^2+1*2^3=11
    
  2. 八进制转十进制

    规则:从最低为开始,将个位上的数提取出来乘以8的(位数-1)次方,然后求和
    请将八进制0123转换为十进制的数
     0123=3*8^0 +2*8^1+1*8^2=3+16+64=83
     */
    
  3. 十六进制转十进制

    /*规则:从最低为开始,将个位上的数提取出来乘以16的(位数-1)次方,然后求和
    请将十六进制0x34A转换为十进制的数
    */0x34A=3*16^2+4*16^1+10*16^0=842
    

第二组(十进制转其他进制)

  1. 十进制转二进制

    十进制转换成二进制
     * 规则:将该数不断除于2,直到商为0为止,然后每步得到的余数倒过来,就是对应的二进制
     * 案例:请将56转成二进制
     * 56的二进制就是111000
    

    在这里插入图片描述

  2. 十进制转八进制

    十进制转八进制
     * 规则:将该数不断除于8,直到商为0为止,然后每步得到的余数倒过来,就是对应的八进制
     *156的八进制就是234.
    

在这里插入图片描述

  1. 十进制转十六进制

    十进制转十六进制
     * 规则:将该数不断除于16,直到商为0为止,然后每步得到的余数倒过来,就是对应的十六进制
     *356的十六进制就是0x164
    

在这里插入图片描述

第三组(二进制转其他进制)

  1. 二进制转八进制

    二进制转换为八进制
     * 规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可
     * 案例:请将11010101转成八进制
     *拆分
     101=5
     010=2
     11=3
     合起来为:325
    
  2. 二进制转十六进制

    规则:低位开始,将二进制数每四位一组,转成对应的十六进制数即可
    案例请将11010101转成十六进制
    0101=5
    1101=D
    合起来为:
    11010101= 0xD5
    

第四组(其他进制转二进制)

  1. 八进制转二进制

    八进制转换成二进制
     * 规则:将八进制数每一位,转成对应的一个3位的二进制数即可
     * 0237=10011111
     *7:111
    3:011
    2:010
    合起来:010011111
    
  2. 十六进制转二进制

     十六进制转换为二进制
     * 规则:将十六进制数每一位,转成对应的4位的一个二进制数即可
     * 案例:请将0X23B转成二进制
     * B=11=1011
     * 3=0011
     * 2=0010
     * 组合而成为:1000111011
    

3)二进制在运算中的说明

说明

二进制是逢2进位的进位制,0、1是基本算符

现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便。易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢二进制一”数字1在不同的位上代表不同的值。按从右至左的次序。这个值以二倍递

原码、反码、补码

对于有符号的而言:(非常重要,一定要记住)

  1. 二进制的最高位是符号位:0表示正数,1表示负数
  2. 正数的原码、反码、补码都一样(三码合一)
  3. 负数的反码=它的原码符号位不变,其他位取反(0->1,1->0)
  4. 负数的补码=它的反码+1
  5. 0的反码,补码都是0
  6. 在计算机运算的时候,都是以补码的方式来运算的(因为它可以把正数和负数统一起来)

图:

在这里插入图片描述

C语言位运算说明(1)

他们的运算规则是:

  • 按位与 & : 两位全为1,结果为1,否则为0
  • 按位或 | : 两位有一个1,结果就是1,否则为0
  • 按位异或^ : 两位一个为0,一个为1结果为1,否则为0
  • 按位取反 : 0->,1->0
  • 比如:~2=? ~-5=? 2&-3=? 2|3=? 2^3=?
#include<stdio.h>
void main(){
    int a=1>>2;//向右位移2位这里涉及到二进制中 原码、反码补码
    int b=-1>>2;
    int c=1<<2;  //向左位移2位
    int d=-1<<2;
    //a,b,c,d四个数的结果是多少
    printf("a=%d b=%d c=%d d=%d",a,b,c,d);
    printf(" --------\n");
    int e =~2;//按位取反
    int f = 2&3;
    int g= 2|3;
    int h=~-5;
    int i=13&7;
    int j=5|4;
    int k=-3^3;
    printf("e=%d f=%d g=%d h=%d i=%d j=%d k=%d",e,f,g,h,i,j,k);

}
输出:a=0 b=-1 c=4 d=-4
输出e=-3 f=2 g=3 h=4 i=5 j=5 k=-2运算原理:
    

在这里插入图片描述

C语言位运算说明(2)

>>、<<算数右移和算术左移运算规则为:
算术右移>>: 低位溢出,符号位不变,并用符号位补溢出的高位
算术左移<<:符号位不变,低位补0
int a=1>>2;//1/2/2=0
int d=-1>>2;// -1
int c=1<<2;//1*2*2=4

在这里插入图片描述

(他们在进行计算时都是靠他们的补码进行运算,所以在移的过程中都是靠补码的移动)这些题要自己推一遍;

#include<stdio.h>
void main2(){
    int a=1>>2;//向右位移2位这里涉及到二进制中 原码、反码补码
    int b=-1>>2;
    int c=1<<2;  //向左位移2位
    int d=-1<<2;
    //a,b,c,d四个数的结果是多少
    printf("a=%d b=%d c=%d d=%d",a,b,c,d);
    printf(" --------\n");
    int e =~2;//按位取反
    int f = 2&3;
    int g= 2|3;
    int h=~-5;
    int i=13&7;
    int j=5|4;
    int k=-3^3;
    printf("e=%d f=%d g=%d h=%d i=%d j=%d k=%d",e,f,g,h,i,j,k);

}

最后练习:-1>>2是多少?(以下是我通过求出-1的补码然后进行右移在通过求它的反码最后将反码转成原码求得正确答案)

-1>>2是多少?
原码

10000000 00000000 00000000 00000001
反码
11111111 11111111 11111111 11111110
补码;
11111111 11111111 11111111 11111111

右移(整个二进制数向右边移动,负数的话左边补上1,正数左边补上0):
11111111 11111111 11111111 11111111
反码:(根据:负数的补码=它的反码+1)
11111111 11111111 11111111 11111110
原码(负数的反码=它的原码符号位不变,其他位取反(0->1,1->0))
10000000 00000000 00000000 00000001
所以说:
-1>>2=-1

11111111 11111111 11111111 11111111

右移(整个二进制数向右边移动,负数的话左边补上1,正数左边补上0):
11111111 11111111 11111111 11111111
反码:(根据:负数的补码=它的反码+1)
11111111 11111111 11111111 11111110
原码(负数的反码=它的原码符号位不变,其他位取反(0->1,1->0))
10000000 00000000 00000000 00000001
所以说:
-1>>2=-1


-1>>2 ==-1!!!
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值