文章目录
一、前言
你听说过进制吗?你知道进制怎么表示吗?你知道进制如何转换吗?这篇帖子就能get进制。另外,在二进制中,我们还会用到位运算符号
二、正文
(一)位运算
a&b
:按位与,写作AND
,相同二进制数位对齐(如果是其他进制则会自动转换),各个位进行比较,如果相同位上两值都为1,则将结果的那一位也写为1,否则写为0
10110
AND 10111
-----------
10110
a|b
:按位或,写作OR
,相同二进制数位对齐,各个数位进行比较,若两个相同数位中至少有一个的值为1,那么结果的那一位写为1,否则写为0
10010
OR 10111
----------
10111
a^b
:按位异或,写作XOR
,相同二进制数位对齐,各个数位进行比较,若两个相同数位不相等,那么结果的那一位就写为1,否则写为0
10001
XOR 10110
-----------
111
~n
:按位取反,1变0,0变1
1011001
-------
100110
n<<m
:将n向左移动m位,前位缺位就补0
1111010
<< 10 → 2
----------
111101000
n>>m
:将n向右移动m为,缺位就删数
111010
<< 10 → 2
----------
1110
(二)进制
1. 进制的定义
(1) 二进制(BIN)
只有0和1两个数字,加法遵循“逢二进一”的原则,减法遵循“借一为二”原则。二进制数 1010010 1010010 1010010写作 ( 1010010 ) 2 (1010010)_{2} (1010010)2、 0 b 1010010 0b1010010 0b1010010或 1010010 B 1010010B 1010010B。这是计算机中经常使用的,因此使用位运算会大大降低运算复杂度
(2) 八进制(OCT)
有数字0~7,加法遵循“逢八进一”的原则,减法遵循“借一为八”原则。八进制数 17 17 17写作 ( 17 ) 8 (17)_{8} (17)8、 0 o 17 0o17 0o17或者 17 O ( 字母 ) 17O(字母) 17O(字母)
(3) 十进制(DEC)
这个不用说了吧,在生活中常用数字。十进制数 95 95 95写作 95 D 95D 95D或 ( 95 ) 10 (95)_{10} (95)10,也可以直接写
(4) 十六进制(HEX)
从0~F的数字,在9后,10用A或a表示,11用B或b表示,……,15用F或f表示。加法遵循“逢十六进一”原则,减法遵循“借一为十六”原则
2. 进制表
这是个人创作的,允许转发、使用、借鉴
3. 进制转换
(1) 10进制转D进制
一般我们都是把10进制转换为2进制,整数部位使用短除法的形式,依次除以D,将余数写在右边,最终将余数从下往上读;小数部位使用乘法的形式,依次乘D,若这个数大于一个整数,就在竖式右边写上那个整数,随后将结果减去整数,否则在右边写上0,直到最终结果为整数,再从上往下读(题目一般会给出精度)
如何使用编程实现呢?
输入共两行,分别表示整数(N)和进制(D)
输出共一行,表示N的D进制
#include <iostream>//输入输出流
#include <string>//输出结果
using namespace std;
inline char tochr(short n) {
//将数字转换为字符
if(n<10)
return n+48; //'0'的ASCII码是48
if(n>=10&&n<16)
return n+55; //'A'的ASCII码是65
}
int main() {
unsigned long long n; //原数
short d; //进制
cin >> n >> d;
string s; //结果
while(n) {
//也可以写成while(n!=0)
s = tochr(n%d) + s; //转换
n /= d; //获得商
}
while(s[0]=='0') s.erase(0, 1); //删除前导0
if(s.empty()) s = "0"; //n为0的情况
cout << s;
return 0;
}
(2) D进制转十进制
我们可以使用位权法进行转换,比如将二进制数1101转换为十进制
( 1101 ) 2 = 2 3 + 2 2 + 2 0 = 8 + 4 + 1 = 13 (1101)_{2} = 2^{3}+2^{2}+2^{0} = 8+4+1=13 (1101)2=2<