标签:
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 //定义10进制数,打印出10、8、16进制的值 6 int a = 13; 7 printf("%d\n",a); 8 printf("%o\n",a); 9 printf("%x\n",a); 10 11 //int 64 4个字节 12 int b = 0b00000000000000000000000000001101; 13 printf("%d\n",b); 14 15 //015是一个8进制数 16 int b1 = 015; 17 printf("%d\n",b1); 18 19 //定义一个16进制的数,打印其10进制值 20 int b3 = 0x520A; 21 printf("%d\n",b3); 22 23 return 0; 24 }
13 15 d 13 13 21002
-------------------------------
【理解】原码反码补码基本概念
原码: 一个数绝对值的二进制表示,如果是+ 最高位(最最侧的位) 改0 - 最高位(最最侧的位) 改1 反码: 正:正数的反码等于原码 负:除符号位不变,其他位逐位取反(1->0,0->1) 补码: 正:正数的补码等于原码 负: 1)反码+1 2)在原码基础上符号位不变,其他各位取反,最后再+1 注意: 一个整数的原码、反码、补码都一样
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 6 //64为机器下 7 // int 类型占用 4个字节 ,每个字节8为 8 // 计算机存储1使用32位的二进制数码,存储的事补码 9 10 // +1 存储的事补码 11 // 原码:000000000000000000000000000000001 12 // 反码 == 原码 13 // 补码 == 原码 14 15 int b1 =0b000000000000000000000000000000001; 16 printf("b1 = %d\n",b1); 17 18 // -1 存储的是补码 19 // 原码:100000000000000000000000000000001 20 // 反码:111111111111111111111111111111110 21 // +000000000000000000000000000000001 22 // -------------------------------------- 23 // 补码:111111111111111111111111111111111 -1 24 25 int b2 = 0b111111111111111111111111111111111; 26 printf("b2 = %d\n",b2); 27 28 return 0; 29 }
b1 = 1 b2 = -1
-----------------------------------------------------
【理解】为什么要引入反码、补码?
电路更简单
---------------------------
【掌握】位运算符介绍及使用
运算符: 运算符用来连接操作数,组成有意义的式子 分类: 算术 关系 逻辑 位运算 位运算: 用于整数的二进制位之间的运算 & 按位与:如果两个位进行&操作,同1则结果为1,有0结果就为0 9 & 8 00000000000000000000000000001001 &00000000000000000000000000001000 ------------------------------------------ 00000000000000000000000000001000 | 按位或:如果两个位进行|操作,有1则结果为1,同0结果就为0 00000000000000000000000000001001 &00000000000000000000000000001000 ------------------------------------------ 00000000000000000000000000001001 9 ~ 按位取反:1变0 ,0变1 ~9; 00000000000000000000000000001001 ~ ----------------------------------- 11111111111111111111111111110110 补 补码-->原 :符号位不变,取反+1 10000000000000000000000000001001 反 10000000000000000000000000001010 原 -10 ^ 按位异或:相同为0,不同为1 9^8 00000000000000000000000000001001 & 00000000000000000000000000001000 ------------------------------------------ 00000000000000000000000000000001
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 //进行按位与运算 5 int result = 9 & 8; 6 //按位或 7 result = 9|8; 8 //按位取反 9 result = ~9; 10 //9异或8 11 result = 9^8; 12 13 printf("result = %d\n",result); 14 return 0; 15 }
result = 1
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 /* 6 7 >> 右移位 8 8>>2 == 2 9 10 一个数右移n位,值等于 原值 除以 2^n,结果是整数部分 11 12 右移位,移出去的部分要舍弃 13 高位要补符号位 14 000000000000000000000000000010 15 | 16 17 右移位,不会改变一个数的正负性 18 19 20 21 << 左移位 22 23 左侧、高位移动出去的位就丢了 24 低位开始补0 25 26 8<<2 == 32 27 记忆的技巧:向左移动n位,相当于原数*2^n 28 29 00000000000000000000000000100000 30 | 31 32 致命问题 33 -1073741823 34 11000000000000000000000000000001; 35 | 36 00000000000000000000000000000100; 37 38 注意:左移可能会改变一个数的正负性 39 40 */ 41 //进行左移运算 42 int result = 8<<2; 43 int b = 0b11000000000000000000000000000001; 44 result = -1073741823 << 2; 45 46 //进行右移位操作 47 // 8/4 48 result = 9>>2; 49 50 51 printf("b = %d\n",b); 52 53 54 int c = 6; 55 //实用技能: 56 //1)获取一个数的最低位 让这个数和1进行按位&操作 57 //...... 00000110 58 //...... 00000001 59 60 //2)向把第30位设置一个0 61 //...... 00000101 4 62 //...... 11111011 63 64 result = c&1; 65 printf("result = %d\n",result); 66 return 0; 67 }
位运算应用:编程实现10进制转2进制
#include <stdio.h> /** * 传递整数n 然后把n转换成二进制,然后输出 * * @param n */ void changeTo2(int n){ //计算数的位数 int len = sizeof(n) * 8; //n = 13 /* 00000000 00000000 00000000 00001101 | 00000000 00000000 00000000 00000001 //1011000000000000000000000000000000 //00 .......... 1 */ int temp; for (int i=0; i<len; i++) { temp = n; //每次循环13 temp = temp>>31-i; //13>>0 13>>1 13>>2 //1、让n 右移i //2、用n移动i位之后的结果和1进行按位与 int t = temp & 1; printf("%d",t); //3、打印与的结果 } printf("\n"); } int main(int argc, const char * argv[]) { changeTo2(13); return 0; }
应用:实现两个变量值交换
#include <stdio.h> void jiou(int n){ //n和1进行按位与 if (n&1) { printf("奇数\n"); }else{ printf("偶数\n"); } // 1 奇数 // 0 偶数 } int main(int argc, const char * argv[]) { // jiou(6); int a = 3,b=4; //a = 4,b = 3; printf("a = %d,b = %d\n",a,b); //交换变量之前 // int temp; //临时变量 // //3 3 // temp = a; // //4 4 // a = b; // //3 3 // b = temp;‘ a = a^b; b = a^b; a = a^b; /* 0011 3 0100 ^ ----- 0111 a = 7 b=4 0111 0100 ^ ----- 0011 b = 3, a = 7 a = a^b; 0111 0011 ^ ------ 0100 a = 4 */ printf("a = %d,b = %d\n",a,b); return 0; }
【掌握】变量地址获取及存储原理
#include <stdio.h> int main(int argc, const char * argv[]) { //定义两个变量,都是int类型的 //高 低 //00000000 00000000 00000000 00000011 int a = 3; //4 //高 低 //00000000 00000000 00000000 00000100 int b = 4; //4 char ch = ‘a‘; //输出一个地址,%p printf("&a = %p\n",&a); printf("&b = %p\n",&b); printf("&ch = %p\n",&ch); //a的地址大,还是b的地址大? //注意:a的地址大,b的地址小,为什么? //计算机分配内存的时候:从高地址向地址分配,先定义的变量,分配的是高地址, // 后定义的变量,分配得时低地址 //a的地址和b的地址一定连续吗?不一定是连续的 //2、变量的存储细节: //低字节 存放在低地址 高字节存在高地址 //3、变量的地址:变量的首地址(变量在内存中占用的存储单元中地址最小的那个地址) return 0; }
&a = 0x7fff5fbff6ec &b = 0x7fff5fbff6e8 &ch= 0x7fff5fbff6e7 //char 是四字节,最后定义所以地址也是最低的
<13>【了解】计算机中的进制+【理解】原码反码补码基本概念+【理解】为什么要引入反码、补码?+【掌握】位运算符介绍及使用+位运算应用:编程实现10进制转2进制
标签:
原文地址:http://www.cnblogs.com/kongweiiwei/p/4624466.html