title: using ``1ll<<(N-1)`` to assign a large number of value to a long long int variable
body: <p>The question I saw was stated: You are given an array <strong>A</strong> of size <strong>N</strong>. An element <strong>Ai</strong> is said to be charged if its value(<strong>Ai</strong>) is greater than or equal to <strong>Ki</strong> and <strong>Ki</strong> is the total number of subsets of the array <strong>A</strong>, that contains an element <strong>Ai</strong>. </p>
  
  <p>The logic is simply the number of times a number comes as a subset is 2^N-1 times. But in some test cases, N was 4000+. so, 2^N-1 will be way beyond any variable type can hold but in editorial, the writer used <code>1ll&lt;&lt;(N-1)</code>. I know the left shift operator is <code>X&lt;&lt;Y = X*2^Y</code>. But what is this 1ll? And how is it able to store such large value? </p>
  
  <pre><code>#include &lt;bits/stdc++.h&gt;
  
  #define M 1000000007
  
  using namespace std;
  
  int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int T;
    cin &gt;&gt; T;
    while (T--) {
      int N;
      cin &gt;&gt; N;
      long long arr[N];
      for (int i = 0; i &lt; N; i++)
        cin &gt;&gt; arr[i];
      if (N &gt;= 64)
        cout &lt;&lt; 0 &lt;&lt; endl;
      else {
        long long val = (1ll &lt;&lt; (N - 1));
        long long ans = 0;
        for (int i = 0; i &lt; N; i++)
          if (arr[i] &gt;= val)
            ans = (ans + arr[i] % M) % M;
        cout &lt;&lt; ans &lt;&lt; endl;
      }
    }
  }
  </code></pre>
  
  <p><code>1&lt;&lt;N-1</code> explains <strong>2^N-1</strong> but does the 1ll means that it can take upto long long and <code>long long val = 1ll&lt;&lt;N-1</code>; means it can go upto 128bit?</p>