位元運算

邏輯上的運算子在 C 中的語法分別如下:

  • AND (&)

  • OR(|)

  • NOT(!)

  • XOR(^)// bit值不一樣為 1

  • complement(~)

  • shift (<<, >>)

bitwise 的操作常與 "0x" 這種 16 進位表示法,方便轉換操作。

[例題] 基本運算

unsigned long num_a = 0x00001111;
unsigned long num_b = 0x00000202;
unsigned long num_c;

num_c = num_a & (~num_b);
num_c = num_c | num_b;

printf("%lx", num_c); // 00001313

[例題] mask 方法做 bitwise 操作

a = a | 7    // 最右側 3 位設為 1,其餘不變。
a = a & (~7) // 最右側 3 位設為 0,其餘不變。
a = a ^ 7    // 最右側 3 位執行 NOT operator,其餘不變。

複製:memcpy 和 strcpy

1. 記憶體複製

void *memcpy( void *dest, const void *src, size_t count );

memcpy() 可以複製任何類型資料,不處理字串結束 '\0' 的情況,當 *src 長度大於 *dest 時會 buffer overflow (編譯時不會錯誤)。

2. 字串複製

void *strcpy( void *dest, const void *src);

strcpy() 只能用於字串複製,不需要指定長度,因為會自動偵測以 '\0' 為結尾,當 *src 長度大於 *dest 時會 buffer overflow (*dest 將沒有 \0)。

#include <string.h>
#include <stdio.h>
int main (){
 const char *str1 = "abc\0def";
 char str2[16] = {0};
 char str3[16] = {0};

 strcpy(str2, str1);
 memcpy(str3, str1, sizeof(str3)); // 8
 printf("str2 = %s\n", str2);    // str2 = abc
 printf("str3 = %c\n", str3[5]); // str3 = e
 return 0;
}

最后更新于

这有帮助吗?