(二十)位运算与进制

一、前言

你听说过进制吗?你知道进制怎么表示吗?你知道进制如何转换吗?这篇帖子就能get进制。另外,在二进制中,我们还会用到位运算符号

二、正文

(一)位运算

  1. a&b:按位与,写作AND,相同二进制数位对齐(如果是其他进制则会自动转换),各个位进行比较,如果相同位上两值都为1,则将结果的那一位也写为1,否则写为0
    10110
AND 10111
-----------
    10110
  1. a|b:按位或,写作OR,相同二进制数位对齐,各个数位进行比较,若两个相同数位中至少有一个的值为1,那么结果的那一位写为1,否则写为0
   10010
OR 10111
----------
   10111
  1. a^b:按位异或,写作XOR,相同二进制数位对齐,各个数位进行比较,若两个相同数位不相等,那么结果的那一位就写为1,否则写为0
    10001
XOR 10110
-----------
      111
  1. ~n:按位取反,1变0,0变1
1011001
-------
 100110
  1. n<<m:将n向左移动m位,前位缺位就补0
       1111010
<<          10 → 2
    ----------
     111101000
  1. 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<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值