位运算、进制、bitset

一、x进制转成y进制

步骤:x进制通过乘方累加转为10进制;
10进制通过除y求余转为y进制,倒序输出。
特殊:2进制转8进制,从低位三位三位转也行,不够补0;
2进制转16进制,只要把二进制数从右往左每四位为一组计算出对应的一位十六进制数(不足四位的,前面添加“0”补足四位)。

二进制—>十进制:乘方累加
例:1001101 ==> 77
1×2^6 + 0×2^5 + 0×2^4 + 1×2^3 + 1×2^2 + 0×2^1 + 1×2^0

十进制—>二进制:除以2求余,在倒序(使用栈:先进后出)输出

例:61 == > 111101

二、位运算

  1. & 按位与 :1 & 1 = 1, 1 & 0 = 0,0 & 1 = 0,0 & 0 = 0;
  2. | 按位或:1|1 = 1,0|1 = 1,1|0 = 1,0|0 = 0;
  3. ^ 按位异或:1^1 = 0,1^0 = 1,0^0 = 0,0^n = n(相同取0,不同取1)
  4. ~ 取反;
  5. << :左移,右边补0(每移一位,×2);
  6. >> :右移,左边补0(每移一位,/2);
    例:10011(19)>> 1 == > 01001(9)

1 . 判断奇偶

if (n&1)	奇数
else	偶数

2 . 交换两个数(x,y)

x = x^y;
y = x^y;
x = x^y;

3.在一串数字中找出唯一一个不重复的数字 == > 排序后把全部数字异或^
eg. 123451234 = 5

4.求m的n次方 O(log n)

// m, n = 13 = 1101(二进制)
int sum = 1;
while(n != 0)
{
    if(n & 1 == 1)	sum *= m;
    m *= m;
    n = n >> 1;		//找1101的1
}

5.找出不大于 n 的最大2的i次方 O(1)

② 0变1的实现:我们假设最左边的 1 处于二进制位中的第 k 位(从左往右数),那么把 n 右移一位之后,那么得到的结果中第 k+1 位也必定为 1,然后把 n 与右移后的结果做或运算,那么得到的结果中第 k 和 第 k + 1 位必定是 1;同样的道理,再次把 n 右移两位,那么得到的结果中第 k+2和第 k+3 位必定是 1,然后再次做或运算,那么就能得到第 k, k+1, k+2, k+3 都是 1,如此往复下去…

int findN(int n)
{
	n |= n >> 1; 
	n |= n >> 2; 
	n |= n >> 4;
	n |= n >> 8; 
	n |= n >> 16;// 整型一般是 32 位,上面我是假设 8 位。 
	return (n + 1) >> 1;
}
  1. ①求n的第k位数字: n >> k & 1 (右边开始数第k个)
    ②返回n的最后一位1:lowbit(n) = n & -n = n & (~n + 1)
    eg. n = 101000 lowbit(n) = 1000

三、bitset == > 不同于数组和字符串,从右往左存

  1. 构造:bitset<32>b (无参数)

    ​ bitset<32>b(16) (int参数)

    ​ bitset<32>b(ss) (ss:字符串)

  2. bitset支持位运算

  3. 常用函数

bitset<8> b(“10101101”);
size():bitset的长度 cout<<b.size()<<endl; //8
count():统计bistet中1的个数 cout<<b.count()<<endl; //5
to_string():将bitset转化为string类型
to_ulong():将bitset转化为unsigned long类型
to_ullong() :将bitset转化为unsigned long long类型
bitset<4> b(“1111”);
cout<<b.to_string()<<endl; //1111
cout<<b.to_ulong()<<endl; //15
cout<<b.to_ullong()<<endl; //15

flip()和flip(int):不传入参数将所有位取反,传入参数只将参数位取反C++bitset<8> b(“10101101”);
cout<<b.flip()<<endl; //01010010
cout<<b.filp(0)<<endl; //10101100
set():将参数每一位置为1
reset():将参数每一位置为0
C++bitset<8> b;
b.set(); //11111111
b.reset(); //00000000
Find_first():从低位到高位找下一个含有1的位置。
Find_next(pos):找当前位置的下一个1的位置。
bitset<10>b(“01001100”);
b._Find_first();//3
b.Find_next(4);//7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlq070707

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值