此程序中的i<1<<n和p&(1<<j)是什么意思?求解
#include<stdio.h>int main(void){
int n,a[1000],i,j,p;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<1<<n;i++){
p=i;
for(j=0;j<n;j++)
if(p&(1<<j))
printf(" %d",a[j]);
printf("\n");
}
return 0;
}