01/10/2018, 08:35

Hỏi về kí hiệu <<

#include <bits/stdc++.h>
#define maxd 1<<10
using namespace std;
vector<int> x;
vector<int>::iterator it;
int k;
long d[maxd];
long a[11];
long long dem;
void check(vector <int> x) {
long sum=0;
for( it = x.begin()+1; it < x.end(); it++ ) {
    if (*it ==1 ) sum += a[it-x.begin()];
}
if (sum <= (1 << k)) d[sum]++;
}
void ChinhHopLap(long i) {
for (long j=0; j<=1; j++) {
    x[i]=j;
    if (i==k) check(x);
    else ChinhHopLap(i+1);
}
}

int main() {
std::cin >> k ;
for (int i=1; i<=k; i++) std::cin >> a[i];
x.resize(k+1, -1);
x[0]=0;
ChinhHopLap(1);
for (long i=0; i<maxd; i++)
if (d[i]==0) {
    std::cout << i;
    return 0;
}
}

Mọi người có thể giải thích cho em kí hiệu << trong chỗ 1 << k là gì và có tác dụng gì không ạ. Em cảm ơn.

rogp10 viết 10:37 ngày 01/10/2018

Giải theo số học: 1*2^k đó bạn

Mà gán khơi khơi [quote=“masteryolo24, post:1, topic:42667”]
for (int i=1; i<=k; i++) std::cin >> a[i];
[/quote]
chắc ko vào đâu lí do là chưa resize().

Trần Vũ Đức viết 10:49 ngày 01/10/2018

vậy tức là 1 << k = 1 * 2^k đúng không ạ

Trần Vũ Đức viết 10:46 ngày 01/10/2018

là sao ạ. Anh giải thích cho em rõ được không ạ

Zhang Jike viết 10:43 ngày 01/10/2018

Đấy là phép dịch bit đó bạn. 1 << k
Ví dụ 1 << 3 tức là dịch số 1 sang trái 3 lần
0001 thành 1000 = 1.2^3 + 0.2^2+0.2^1+0.2^0

Văn Dương viết 10:37 ngày 01/10/2018

Đó là phép toán dịch bit.
<< là dịch bit sang trái.
'>> là dịch bit sang phải.
A>>=x, A<<=x là dịch bit của A sang trái hoặc phải bao nhiêu bit.
Ví dụ:

unsigned char A=0x0F; //(00001111)
A>>=2; //(A=00000011)
A<<=3; //(A=00011000)
Bài liên quan
0