HDU 5980 Find Small A(二进制运算)

题意:给定一个数,它的二进制形式中包含多少个’a’

‘a’的 ASCII码为97,且字符’a’占8个二进制位,97的二进制形式为01100001
因此只要打印出每个数的二进制位,每8位为一个区间,比较这个区间与97的二进制区间是否相同,统计相同数即可;
需要注意的是该题打印二进制码是逆序;

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int digit[40];
int adigit[9]{0,1,0,0,0,0,1,1,0};
int main(){
    ll n;
    while(~scanf("%lld",&n)){
        ll ans=0;
        while(n--){
            ll a;
            scanf("%lld",&a);
            int cnt=1;
            while(a/2){
                digit[cnt++]=a&1;
                a=a>>1;
            }
            digit[cnt]=a;
            for(int i=cnt+1;i<=32;i++) digit[i]=0;
            for(int i=1;i<=8;i++){
                if(digit[i]!=adigit[i]){
                    break;
                }
                if(i==8) ans++;
            }
            for(int i=9;i<=16;i++){
                if(digit[i]!=adigit[i-8]){
                    break;
                }
                if(i==16) ans++;
            }
            for(int i=17;i<=24;i++){
                if(digit[i]!=adigit[i-16]){
                    break;
                }
                if(i==24) ans++;
            }
            for(int i=25;i<=32;i++){
                if(digit[i]!=adigit[i-24]){
                    break;
                }
                if(i==32) ans++;
            }

        }
        printf("%lld\n",ans);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值