------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
数位: 从右往左,从零开始
基数: 每个数位上可以使用数码的个数(2 进制数字的基数为2
十进制为10)
位权: 某个数位上得数字的实际大小
1.******************** 二进制转十进制 ********************
0b1100 = 0 * 2的0次方 + 0 * 2的1次方 + 1 * 2的2次方 + 1 * 2的3次方
=0 + 0 + 4 + 8
=12
0b1111 = 1 + 2 + 4 + 8
=15
0b1010 = 0 + 2 + 0 + 8
=10
2. 十进制转二进制
67 = 64 + 2 + 1
=2的6次方 + 2的1次方 + 2的0次方
=0b1000000 + 0b10 + 0b1
=0b1000011
10 -> 2 / 8 / 16 除以2 / 8 /16 倒取余数法(小数部分乘以2取整)
2 / 8 / 16 -> 10 按权展开
123 = 100 + 20 + 3
1*10^2 +2*10^1+3*10^0
数码 * 基数^数位
主要掌握 : 10 2 16进制的转换
******************** n位二进制的取值范围 ********************
2位二进制的取值范围: 0~3 0~2的2次方-1
3位二进制的取值范围: 0~7 0~2的3次方-1
n位二进制的取值范围: 0~2的n次方-1
第1位为正负位
char 的取值范围: -2的7次方~2的7次方-1
int 的取值范围: -2的31次方~2的31次方-1
******************** 机器数与真值 ********************
1 机器数是带有符号的
2 机器数就是在计算机中得二进制形式
3 真值是指机器数表示的实际数字
一个数字,如果需要搞清楚在计算机中如何表示,
只要将其转换为二进制即可;
要求计算机可以用二进制数表示负数
数字一定要可以比大小
数字一定要可以计算加法
全部为1的二进制数字可以表示 -1
二进制全部为1即可以是整数也可以是负数,认为规定从左往右第一个
二进制为表示符号位,为0表示正数,1为表示负数
认为规定数字的正数表示的二进制是计算机中得二进制一致的
而负数的二进制的表示方法利用正数的数据为一位取反后加一来表示
正数: 原码 = 反码 = 补码(都一样)
负数:
1 将原码的符号位改为1即负号
2 反码 符号位后边的原码取反
3 补码 反码 + 1
步骤1: 1000 0000 0000 0000 0000 0000 0000 1010
步骤2: 1111 1111 1111 1111 1111 1111 1111 0101
步骤3: 1111 1111 1111 1111 1111 1111 1111 0101 + 1
= 1111 1111 1111 1111 1111 1111 1111 0110
******************** 位运算 ********************
按位与(&) (同1得1) 2 & 3 = 10 & 11 = 10 = 2
按位或(|) (同0得0) 1 | 2 = 01 | 10 = 11 =3
按位反 ~1 = 0
按位异或
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
左移 <<
每一位向左移动,超出忽略,不够补零(正负编译器决定)
左移n位 相当于乘以2的n次方
右移>>
补符号位
无符号的类型(非负数)右移补零
char 1个字节 8个二进制位
只有7位表示数字
每一位可以表示0和1,那么就由2^7中数字可以表示,即128个数字
负数即为: -1~-128
零:0
正数:1~ 127
******************** 类型说明符 ********************
unsigned(无符号,无符号位) %u 表示无符号 和 signed(有符号)
signed int == signed 二进制的取值范围 -2的31次方到2的31次方-1
unsigned int == unsigned 二进制的取值范围 0到2得32次方-1
signed表示有符号的,平时定义变量 int num;
默认实际为 signed int num;
unsigned 就是表示一个无符号的数据,取值范围增大,
那么所以字节数就都表示的是数字
(unsigned) // c1 = 1<<7; // (128) //-128
(类型说明符,只能修饰int) : short 和 long 和 long long == long long int 8个字节 (%lld)
short == short int 2个字节 %d
long == long int 8个字节 %ld
long unsigned int c == long unsigned c %lu
short unsigned int c == short unsigned c %u
int s = sizeof(long long int)(long long int 的字节数)
******************** 交换变量 ********************
a= a+b
b= a-b
a= a-b
a= a*b
b= a/b
a= a/b
*/
//******************** 编程实现打印出数字的二进制数内容 ********************
/*
%d/%i 十进制形式输出正式
%c 输出字符
%p 输出地址
%f 输出小数
%o 打印8进制数
%x 打印16进制数
int main()
{
// 默认情况下,就是十进制
int number = 12;
// 二进制(0b或者0B开头)
int number2 = 0B1100;
// 八进制(0开头)
int number3 = 014;
// 十六进制(0x或者0X开头)
int number4 = 0xc;
// %d以10进制整数的形式输出一个数值
//%x打印16进制数
printf("%x\n", number);
return 0;
}
*/
#include <stdio.h>
int main()
{
void putBinary(int);
//putBinary(-13);
putBinary(13);
return 0;
}
// 输出一个整数的二进制存储形式
void putBinary(int n)
{
int bits = sizeof(n) * 8;
while (bits-- > 0) {
printf("%d", n>>bits&1);
if (bits%4==0) printf(" ");
}
printf("\n");
}
// 小写字母转为大写
char upper(char c){
//如果是小写字母,就转成大写
if(c >= 'a' && c <= 'z'){
return c - ('a' - 'A')//32;
}else{
//如果不是小写字母,就返回字母本身
return c;
}
}
#include <stdio.h>
int main(int argc, const char * argv[]) {
char cc = upper('f');
printf("%c\n",cc);
return 0;
}
/*
使用位异或运算符交换两个变两得值
*/
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a = 10;
int b = 11;
// a ^ b ^ a = b
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("Hello, World!\n");
return 0;
}
//用位与&运算符判断变量的奇偶性
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a;
scanf("%d",&a);
if(a&1 == 1){
printf("奇数\n");
}else if(a&1 == 0){
printf("偶数\n");
}
/*
if (a%2) {
printf("奇数\n");
} else {
printf("偶数\n");
}*/
return 0;
}
// 写一个函数,用来输出整数在内存中得二进制形式
//
// Created by 李佳乐 on 15-3-12.
// Copyright (c) 2015年 gongsimingzi. All rights reserved.
//
/*
#include <stdio.h>
void printEr(int num){
int value;
int temp = (sizeof(num)<<3)-1;
for(int i = temp ;i >= 0;i--){
value = (num>>i)&1;
printf("%d",value);
}
printf("\n");
}
int main(int argc, const char * argv[]) {
printEr( 9 );
return 0;
}
*/
#include <stdio.h>
void printEr(int num);
int main()
{
printEr(9);
return 0;
}
void printEr(int num){
int temp = (sizeof(num)<<3)-1;
while(temp >= 0){
//先挪位,再&1,取出对应的值
int value = num>>temp&1;
printf("%d",value);
temp--;
//每输出4位,就输出一个空格
if((temp + 1)%4 == 0){
printf(" ");
}
}
printf("\n");
}
// 显示数字的二进制数
#include <stdio.h>
int main(int argc, const char * argv[]) {
int num = 2;
unsigned int mark = (unsigned int)num;
int temp;
for (int i = 0; i < 32; i++) {
temp = (mark & (1<<31))>>31;
printf("%d",temp);
mark<<=1;
}
printf("\n");
return 0;
}
// 类型的取值范围
#include <stdio.h>
int main(int argc, const char * argv[]) {
printf("char:%lu\n",sizeof(char));
printf("int:%d\n",sizeof(int));
printf("short:%d\n",sizeof(short));
printf("long:%d\n",sizeof(long));
printf("long long:%d\n",sizeof(long long));
printf("Hello, World!\n");
unsigned int num;
num = (unsigned int)0 - 1;
printf("%u\n",num);
printf("有符号的最大值%d\n",num>>1);
printf("有符号的最小值%d\n",num<<31);
return 0;
}