二進位制翻轉、結構體指標

WJnuHhail發表於2024-06-13

試寫一個函式,傳入一個引數unsigned char num,把num按位進行整個數值翻轉。規則:使用位運算,不能另外使用變數儲存,寫出最優的方案。例:num二進位制為10010111; 翻轉後 num二進位制是11101001

unsigned char reverseBitsChar(unsigned char ch)
{
    ch = (ch & 0x55) << 1 | (ch >> 1) & 0x55;
    ch = (ch & 0x33) << 2 | (ch >> 2) & 0x33;
    ch = (ch & 0x0F) << 4 | (ch >> 4) & 0x0F;
    return ch;
}
#include<stdio.h>
struct st
{
      int n;
      int *m;
}*p;

void main()
{
    int d[5]={10,20,30,40,50};

    struct st arr[5]= {100,d,200,d+1,300,d+2,400,d+3,500,d+4};
    
    p=arr;
    
    printf("%d\t",++p->n);
    
    printf("%d\t",(++p)->n);
    
    printf("%d\n",++(*p->m));
}

A.101 200 21

B.101 20 30

C.200 101 21

D.101 101 10
/***********************************************************************    
    keys:結構體指標p指向結構體陣列arr,結構體陣列中有5個結構體,其中,成員d為陣列d中“10”這個成員的地址,成員d+1是陣列d中“20”這個成員的地址,成員d+2是陣列d中“30”這個成員的地址,成員d+3是陣列d中“40”這個成員的地址,成員d+4是陣列d中“50”這個成員的地址。
 
 ++p->n    :指標p得到地址下面的值也就是100,字首++之後,得到101。由於結構體內有2個元素,所以*m指向的是成員“d”。
 
 (++p)->n  :指標p先++,偏移一個單位,此時,p指向成員“200”的地址,再得到地址下面的值也就是200。
 
 ++(*p->m) :*p->m得到的是成員“d+1”這個地址下的值為20,由於前++,所以等於21。
 
 選擇選項A.
**********************************************************************/       

以下說法正確的是:A

A.字串至少佔用1個位元組

B.空串不佔用記憶體

C.在char *p = NULL 中,p被稱為空指標,不佔用記憶體

D.在char *s[ ] = "apple" 中,s裡面存放了字串"apple",佔用了6個位元組(含'\0')

keys:
在char *s[ ] = "apple"中,s是一個字元指標陣列,s裡面存放的是字串"apple"的首字元'a'的地址,而不是直接存放整個字串"apple"。整個字串"apple"實際是存放在其他記憶體區域中的。

相關文章