黑马程序员——c语言基础:进制的转换
2015-05-15 01:44
204 查看
1.计算机中的进制
常见的进制:
1)十进制 0、1、2、3、4、5、6、7、8、9
逢十进一。
2)二进制 0、1
逢二进一。书写形式:需要以0b或0B开头,比如0b101。
3)八进制 0、1、2、3、4、5、6、7
逢八进一。书写形式:前面加个0,比如045。
4)十六进制 0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
逢十六进一。书写形式:在前面加个0x或者0X,比如0x45。
例:定义一个10进制数,打印出对应的10、8、16进制数。
#include <stdio.h>
int main(int argc,
const char * argv[]) {
int a = 13;
printf("%d\n",a);
printf("%o\n",a);
printf("%x\n",a);
return 0;
}
2.原码反码补码的概念
原码:一个数的绝对值的二进制表示,如果是正数,符号位(最高位)为0;如果是负数,符号位改为1。
反码:正数的反码等于它的原码。负数的的反码:除符号位不变,其他位逐位取反。
补码:正数的补码等于它的原码。负数的补码为其反码+1。
注意:
1)一个正数的原码、反码、补码都一样。
2)数据在计算机内部是以补码的形式存储的。
3.位运算符介绍
位运算:用于整数的二进制位之间的运算
&
按位与:如果两个数进行&操作,同1则1,有0则0:
9 & 4
00001001
&00000100
————————————————
00000000
实用技能:要获取一个数的最低位,让这个数和1进行按位&操作。
|
按位或:如果两个数进行&操作,有1则1,同0则0:
9 | 4
00001001
|00000100
————————————————
00001101
~
按位取反:1变0,0变1
~9
00001001
~
————————————————
11110110
^
按位异或:相同为0,不同为1
9 ^ 4
00001001
^00000100
————————————————
00001101
>>右移:各二进制位全部右移n位,低位丢弃,高位补符号位。
一个数右移n位,值等于原值除以2^n
右移位不会改变一个数的正负性。
用途:快速计算一个数除以2的n次方。
<<左移:各二进制位全部左移n位,高位丢弃,低位补0
记忆技巧:向左移动n位,相当于原数*2^n
注意:左移可能会改变一个数的正负性
9 << 2
00001001
<<2
————————————————
00110100
位运算符应用举例:
1)编程实现10进制转2进制
#include <stdio.h>
// 10进制转2进制
void changeTo2(int num){
//
获取长度
int len = sizeof(num) *
8;
int temp;
// 定义变量,存储num移位后的值
int t;
// 定义变量,存储num移位后和1进行按位与操作的结果
//
进制转换
for (int i =
0; i < len; i ++) {
temp = num >> (len -
1 - i); //
右移位
//
移位后和1进行按位与操作
t = temp &
1;
// 打印结果
printf("%d",t);
}
}
int main(int argc,
const char * argv[]) {
changeTo2(63);
return 0;
}
2)用按位与算法判断一个数的奇偶性:
#include <stdio.h>
void jiOuXing(int n){
// n和1进行按位与运算
if (n & 1) {
//
结果为1,则是奇数
printf("是奇数");
}
else {
//
结果为0,则是偶数
printf("是偶数");
}
}
int main(int argc,
const char * argv[]) {
jiOuXing(5);
return 0;
}
常见的进制:
1)十进制 0、1、2、3、4、5、6、7、8、9
逢十进一。
2)二进制 0、1
逢二进一。书写形式:需要以0b或0B开头,比如0b101。
3)八进制 0、1、2、3、4、5、6、7
逢八进一。书写形式:前面加个0,比如045。
4)十六进制 0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
逢十六进一。书写形式:在前面加个0x或者0X,比如0x45。
例:定义一个10进制数,打印出对应的10、8、16进制数。
#include <stdio.h>
int main(int argc,
const char * argv[]) {
int a = 13;
printf("%d\n",a);
printf("%o\n",a);
printf("%x\n",a);
return 0;
}
2.原码反码补码的概念
原码:一个数的绝对值的二进制表示,如果是正数,符号位(最高位)为0;如果是负数,符号位改为1。
反码:正数的反码等于它的原码。负数的的反码:除符号位不变,其他位逐位取反。
补码:正数的补码等于它的原码。负数的补码为其反码+1。
注意:
1)一个正数的原码、反码、补码都一样。
2)数据在计算机内部是以补码的形式存储的。
3.位运算符介绍
位运算:用于整数的二进制位之间的运算
&
按位与:如果两个数进行&操作,同1则1,有0则0:
9 & 4
00001001
&00000100
————————————————
00000000
实用技能:要获取一个数的最低位,让这个数和1进行按位&操作。
|
按位或:如果两个数进行&操作,有1则1,同0则0:
9 | 4
00001001
|00000100
————————————————
00001101
~
按位取反:1变0,0变1
~9
00001001
~
————————————————
11110110
^
按位异或:相同为0,不同为1
9 ^ 4
00001001
^00000100
————————————————
00001101
>>右移:各二进制位全部右移n位,低位丢弃,高位补符号位。
一个数右移n位,值等于原值除以2^n
右移位不会改变一个数的正负性。
用途:快速计算一个数除以2的n次方。
<<左移:各二进制位全部左移n位,高位丢弃,低位补0
记忆技巧:向左移动n位,相当于原数*2^n
注意:左移可能会改变一个数的正负性
9 << 2
00001001
<<2
————————————————
00110100
位运算符应用举例:
1)编程实现10进制转2进制
#include <stdio.h>
// 10进制转2进制
void changeTo2(int num){
//
获取长度
int len = sizeof(num) *
8;
int temp;
// 定义变量,存储num移位后的值
int t;
// 定义变量,存储num移位后和1进行按位与操作的结果
//
进制转换
for (int i =
0; i < len; i ++) {
temp = num >> (len -
1 - i); //
右移位
//
移位后和1进行按位与操作
t = temp &
1;
// 打印结果
printf("%d",t);
}
}
int main(int argc,
const char * argv[]) {
changeTo2(63);
return 0;
}
2)用按位与算法判断一个数的奇偶性:
#include <stdio.h>
void jiOuXing(int n){
// n和1进行按位与运算
if (n & 1) {
//
结果为1,则是奇数
printf("是奇数");
}
else {
//
结果为0,则是偶数
printf("是偶数");
}
}
int main(int argc,
const char * argv[]) {
jiOuXing(5);
return 0;
}
相关文章推荐
- 黑马程序员—Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- C语言基础 进制的转换
- Java语言基础(关键字、标识符、注释、常量与变量、进制、数据类型、类型转换、代码示例)
- Java基础:进制转换基础
- JAVA基础学习之命令行方式、配置环境变量、进制的基本转换、排序法、JAVA文档生成等(1)
- 语言基础(项目结构,数据类型,引用类型,转义字符,变量常量,基本的类型转换)
- C语言基础—进制 基本数据类型的存储 位运算
- HLG 1896 将任意进制数转换为十进制 (基础题)
- Java语言基础——进制
- 【Professional C# 读书笔记】(二)-----语言基础:继承,运算符,类型转换的杂七杂八
- C#语言基础— 数据类型及其转换
- Java语言基础-IO流(输入输出流) 字节流、转换流
- 黑马程序员--C语言基础--进制
- C#语言基础——进制
- java基础学习记录之利用数组查表法进行进制转换优化的学习与练习七(十转二、十转八、十转十六)
- C++语言基础 例程 不同类型数据间的转换
- 语言基础——Java_十进制数转换成十六进制数的实现
- java语言基础——5类型转换
- Java基础知识强化106:Java中 int 的各进制之间的转换
- HDU Problem N [ 进制转换 ]——基础dp?