週末副業記

土日は副業エンジニアのブログです。副業に関することを投稿します。

AtCoder Beginner Contest 14B【ビットシフト】


f:id:aisakakun:20200613172154j:plain
ビットシフトについて使い方が分かりやすい問題です。
atcoder.jp

問題概要

この問題は、購入した商品(とある集合における任意の部分集合)の価格を合計するという問題です。各商品はビットが立っている箇所で表現されています。商品の価格はべつの配列で表現されています。
問題の解決方針としては、下記の通りです。(実装する前にメモした方針です。)

方針

  1. n桁までループ
  2. iをn桁までインクリメントする
  3. Xをiビットシフトする
  4. シフトしたXの1桁目が1であるか(ビットが立っているか)を確認する
  5. 1であればa[i]を価格の合計に加算する

コード

using System;

namespace easy_Atcoder
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nx = Array.ConvertAll(Console.ReadLine().Split(),int.Parse);
            int n = nx[0];
            int X = nx[1];
            int[] a = Array.ConvertAll(Console.ReadLine().Split(),int.Parse);
            int sum = 0;
            for(int i = 0; i<n ;i++){
                if(((X>>i)&1)==1){
                    sum += a[i];
                }
            }
            Console.WriteLine(sum);
        }   
    }
}
((X>>i)&1)==1

この箇所がビットシフトの箇所になります。iビット右にシフトすることができます。