您的位置:首页 > 编程语言 > C语言/C++

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: