请高手解析一下这代码,该怎么处理

请高手解析一下这代码
本人c++没入门

C/C++ code
    

1.
int x=999;
    int countx=0;
    while (x) {
        countx ++;
        x=x&(x-1);
    }


为什么countx最后是8?x=x&(x-1);是什么意思?
2.

int a[5]={1,2,3,4,5};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int *)a+1);
    
    printf("%x,%x\n",ptr1[-1],ptr2);

我在xcode上打印出来是 5,-1073755992
解析大师解析一下以上代码




------解决方案--------------------
x&(x-1);
去掉二进制值的最后一个1
------解决方案--------------------
1.x=x&(x-1)每次可以消去x的2进制最右边的那个1. 整段的意思是统计x的2进制形式里面1的个数

2.&a的类型是int(*)[5]所以 &a+1那么意味着指向了a[4]后面这个元素。从而ptr1[-1]就得到a[4]这个元素

a的类型是int[5] (int*)a+1;是将a数组转型为int*然后 +1意味着整个表达式得到的值是a[1]这个元素的地址值。然后将这个地址值赋给了ptr2。