寒假学习打卡第二天

学习打卡第二天

昨晚八点打了场div2的cf,回家挺久了,第一次参与比赛,前两题都是与二进制有关的题目,而我本身对这块并不熟练,······
就a了第一题,第二题暴力超时了

就二进制本身而言,如何将一个正数的二进制表示出来呢?移位符(可能还有其它的方法)。移位符就两种:左移–<<,右移–>>;看箭头方向指哪边就是往哪移
那如何去理解移位操作呢,移位是对这个数的二进制形式去进行移位,比方说有一个数12,二进制形式是1100;左移一位变成11000,简单来说就是右补零。右移一位变成110,右移三位变成1,简单来说就是消右,右移几位就从右边抹去几位

#include<stdio.h>
#include<math.h>
int main(){
	int x;
	scanf("%d",&x);
	for(int i=3;i>=0;i--){//这里i为数据二进制个数-1,2^i次方
	//比方说对于12而言,1100,它二进制数有四位,i=4-1=3
		printf("%d  ",x>>i);
		if(x>pow(2,i)) x-=pow(2,i);//只有大于等于当前次方才能相减,否则x会减成负数
	}
}

从上面可以看出来,需要一个正数的二进制形式需要右移操作,而不是左移,左移是将这个数扩大,右移缩小,移动几位就会相应的扩/缩到原来的2^i

唔,本来打算今天补一下昨天矩形填数的补充,刚打完牛客小白月赛,看错题目人麻了,,,,,,好桑心,咕了,明天补

明天见,今天看书去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值