C语言基础-进制、原反补码、位运算
2015-01-19 14:46
246 查看
计算机中的进制
#include <stdio.h>int main(int argc, const char * argv[]){
int num = 13;
//C语言默认是十进制,关于进制都不区分大小写的
//以0b或0B开头是二进制数
int b = 0b1101;
printf("%d\n",b);//%d是按十进制输出
//以0开头的是八进制数
int o = 015;
printf("%d\n",o);
//以0x或0X开头的数,是十六进制
int x = 0xD;
//以八进制输出 %o %O
printf("%O\n",num);
//以十六进制输出 %x 出来是小写字符 %X大写字符
printf("%X\n",num);
//在C语言中没有输出二进制的格式符
return 0;
}
进制转换
#include <stdio.h>int main(int argc, const char * argv[]){
int num = 13;
/*
十进制转二进制:除2取余倒序排
商 余数
13 / 2 6 1
6 / 2 3 0
3 / 2 1 1
1 / 2 0 1
*/
printf("%d\n",0b1101);
/*
2进制转10进制:二进制上数第N位乘以2 N次方,然后相加
//3210
1101 1 * 2(3) + 1 * 2(2) + 0 * 2(1) + 1 * 2(0)
8 4 0 1
1 1 1 1 1 1 1 1 1 1
512 256 128 64 32 16 8 4 2 1
*/
/*
二进制转八进制:三个二进制位转换为一个八进制位 三个二进制位最大表示7 一个八进制位最大也是表示7
1,101 -> 015
10,001 -> 021
*/
printf("%d\n",0b10001);
printf("%d\n",021);
/*
八进制数转换二进制数:一个八进制位转换为三个二进制位
01,5 -> 0b1101
02,1 -> 0b10001
*/
/*
2进制转16进制:四个二进制位转换为一个十六进制位,四个二进制位最大表示15,一个十六进制位最大也是表示15
0b1101 -> 0xd
0b1001,1010 -> 0x9a
*/
printf("%d\n",0b10011010);
printf("%d\n",0x9a);
/*
16进制转2进制:一个十六进制位转换为四个二进制位
0xd -> 0b1101
0x9,a ->0b1001,1010
*/
// printf("%lf\n",96.oF);
return 0;
}
原码反码补码
#include <stdio.h>int main(int argc, const char * argv[]){
//正整数 原码反码补码都是一样的
//整数默认是有符号的,最高是一个符号位,若为0表示正整数,为1表示负整数
// int num = 0b10000000000000000000011111111111;
// printf("%d\n",num);
int a = 10;
//10 - > 0b 1010
/*
计算机中存储就是补码
负数:
原码:正整数改符号位就是负数的原码
反码:原码符号位不变其他位取反(除了符号位0变1,1变0)
补码:反码 + 1
原码:10000000000000000000000000001010
反码:11111111111111111111111111110101
补码:11111111111111111111111111110110
*/
// printf("%d\n",0b111111111111111111111111111110110);
int num = 0b00000000000000000000000000000000;
int numz= 0b00000000000000000000000000000001;
//0b11111111111111111111111111111110 + 1
int numf= 0b11111111111111111111111111111111;
printf("%d,%d,%d\n",num,numz,numf);
return 0;
}
位运算
#include <stdio.h>/*
位运算:所有的位运算都是针对操作数的每一个二进制位的
按位与 &
按位或 |
按位异或 ^
按位取反 ~
左移 <<
右移 >>
*/
int main(int argc, const char * argv[]){
//按位与 &:两个操作数相应的二进制位进行与运算,一假则假
int result = 13 & 9;
printf("result = %d\n",result);
/*
1101
& 1001
-----------
1001
*/
//按位或 |:两个操作数相应的二进制位进行或运算,一真则真
result = 13 | 9;
printf("result = %d\n",result);
/*
1101
| 1001
-----------
1101
*/
//按位异或 ^:两个操作数对应的二进制位,相同为0,不同为1
result = 13 ^ 9;
printf("result = %d\n",result);
/*
1101
^ 1001
-----------
0100
*/
/*
1、多个数相互异或交换位置,不会改变异或的结果,异或交换律(加法交换律)
2、相同的数进行按位异或,结果为 0
3、任何数按位异或0,都是这个数本身
*/
result = 9 ^ 13 ^ 8;
printf("result = %d\n",result);
result = 0 ^ 15;
/*
1011
^ 0000
-----------
1011
*/
printf("result = %d\n",result);
//按位取反 ~:所有的二进制位,0变1,1变0
result = ~13;
/*
~ 00000000000000000000000000001101
-------------------------------------
11111111111111111111111111110010
*/
printf("%d\n",0b11111111111111111111111111110010);
//左移 x << y :左边操作数(x)所有二进制位,向左移动右边操作数个位(y),移出去位直接删掉,移进位补零
//当这个数比较小的时候,就相当于x * 2的y次方
左移:会改变原来的数符号
result = 1 << 2;
printf("result = %d\n",result);
/*
01000000000000000000000000000001 << 3
----------------------------------------
10000000000000000000000000000010
*/
//右移 x >> y:x 的所有的二进制位向右移动y个位,移出来的位直接删掉,移进来的位补符号位。
//一个数右移y位就相当于除以2的y次方,快速计算一个数除以2的n次方,就是将这个数右移n位
result = 8 >> 2;
printf("result = %d\n",result);
/*
00000000000000000000000000001000 >> 2
----------------------------------------
00000000000000000000000000000010
*/
return 0;
}
相关文章推荐
- C语言基础—进制 基本数据类型的存储 位运算
- 黑马程序员_3 C语言基础-函数-进制-位运算
- Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- C#语言基础——进制
- C语言基础一之预备知识(计算机结构组成、计算机系统组成、进制、原码反码补码)
- C语言基础之编译预处理及位运算
- java语言基础(5)——进制,进制转换以及不同进制的数据的书写方式
- Java笔记之语言基础_按位运算
- 黑马程序员——ios开发基础之C语言之进制转换、位运算与内存管理
- C语言基础--进制
- c语言基础-进制09
- 学ios需要了解的C语言基础知识-4-进制
- 黑马程序员——C语言基础语法--函数、进制、内存分析
- 黑马程序员--C语言基础--进制
- C语言基础 进制的转换
- 黑马程序员-C语言基础七:进制
- 黑马程序员—Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- 黑马程序员——零基础学习iOS开发——05 C语言:进制、内存储存细节、类型说明符、位运算、数组
- 黑马程序员——c语言基础:进制的转换
- C语言基础(八)- 进制转化、计算机补码、位运算符