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

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


一、进制中的转换

#include 
#include 

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
}

二、进制转换的要素

黑马程序员———C语言———【按位运算】_第1张图片

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

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


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

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

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

黑马程序员———C语言———【按位运算】_第2张图片

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

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


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

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

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

黑马程序员———C语言———【按位运算】_第3张图片

实例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

黑马程序员———C语言———【按位运算】_第4张图片

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

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

黑马程序员———C语言———【按位运算】_第5张图片

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

黑马程序员———C语言———【按位运算】_第6张图片

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

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

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

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

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

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

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

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

7、位运算技巧

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

	#include 
	#include 

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

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

	#include 
	#include 

	void main()
	{
    		int num=13;
   		int len=sizeof(int)*8;
   		int r1,r2,r3;
   		for(int i=len-1;i>=0;i--){
      			r1=num>>i;
      			r2=r1&1;
       			printf("%d",r2);
   		}
	}	

解析:

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

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

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

                                                                       ← 逐个向左移动

00000000000000000000000000001101

00000000000000000000000000000001

逐个打印的出的还是:00000000000000000000000000001101


你可能感兴趣的:(黑马程序员———C语言———【按位运算】)