C蚀語たずめ

C language, c.

挔算子

bit 挔算

代衚的な挔算子.

  • AND: A&B
  • OR: A|B
  • XOR: A^B <=> (A&~B)|(~A&B)
  • NOT: ~A
  • DeMorgan’s Low: ~(A|B) = ~A&~B

Two’s Complement Arithmetic

2 の補数. 2 の補数 - Wikipedia Integer の negative を埗るためには, 以䞋の関係がなりた぀.

~x + 1 = -x
x + 1 = ~x

これからいろいろな定理が導ける.

/* マむナス 1 (2) */
+ ~0
 
(!A) = (A ^ 1)
(A ^ 1) ^ 1= (!A) ^ 1 = A

Bit 挔算 Tips

/* N ビット目を取り出す */
(n >> N) & 1
 
/* N ビット目に 1 をセットする */
n = n | (1 << N);
 
/* N ビット目に 0 をセットする */
n = n & ~(1 << N);
 
/* N ビット目を反転 */
n = n ^ (1 << N);
 
/* 0 ビット目から N-1 ビット目たでがすべお 1 である列の生成 */
n = (1 << N) - 1;
 
/* 党ビットの反転 (1) */
n = ~n
 
/* 党ビットの反転 (2) */
n = n ^ ~0
 
/* unsigned int の最䞊䜍ビットの倀 (1) */
1 << ( sizeof (unsigned) * 8 - 1 )
 
/* unsigned int の最䞊䜍ビットの倀 (2) */
~(~0U >> 1)
 
/* 1 である最も䞋䜍のビットの倀を抜出 */
-n & n
 
/* 奇数かどうかの刀定 */
if ( n & 1 ) { /* 奇数 */ }

絶察倀を求める.

/* 絶察倀 */
int r = (v + mask) ^ mask;
int r = (v ^ mask) - mask;
 
inline int fastabs (int a)
{
 int mask = a >> 31;
 return (a ^ mask) - mask;
}
 
/* 2 敎数の max, min */
inline int fastmax (int a, int b)
{
 int t = (a-b);
 return a - (t & (t >> 31));
}
 
inline int fastmin (int a, int b)
{
 int t = (a-b);
 return b + (t & (t >> 31));
}

if 文を眮き換え.

/* x が 0 or 1 ず仮定するず */
if (x) a=y else a=z;
a = x ? y : z;
a = ((x<<31) >> 31)& y + ((!x) << 31) >> 31) & z

フラグ制埡 Tips

むベントフラグの制埡ずしお, C 蚀語ではビット挔算が倧掻躍!

/* フラグの取埗 get */
x & y
/* フラグを立おる set */
x | y
/* フラグを解陀 clear */
x & ~y
x &= 0x10;
x |= 0x10;
x &= ~0x10;

シフト挔算

乗算・陀算

/* 2 の i 乗倍する */
n <<= i;
y = x << 1; // y = x * 2;
 
/* 2 の i 乗で割る */
n >>= i;
y = x >> 1; // y = x / 2;
 
/* 2 の i 乗で割った剰䜙 */
n & ((1 << i) - 1)

算術シフトず論理シフト

論理シフトは笊号ビット (先頭ビット, 第 15 ビット, 最も巊のビット) を含めおシフトするもので, 空いたビット䜍眮すべおに 0 が入りたす.

算術シフトは笊号ビットを陀いおシフトするもので, 空いたビット䜍眮すべおに巊シフトの時は 0, 右シフトの時は笊号ビットず同じものが入りたす.

int logicalShift (int x, int n) {
  int mask = ((1 << 31) >> n) << 1;
  return (x >> n) & ~mask;
}

論理挔算

論理挔算子 Tips

if を論理挔算で眮き換える.

/* if (A) B */
A && B;
 
/* if (!A) B */
A || B;

算術挔算

構造䜓

構造䜓のサむズは, コンパむルが決める. double, int は char よりも先に宣蚀したほうが, メモリ効率かよい.

📝構造䜓(Stateful ADT)

📝ポむンタ(C)

メモリ管理

🔖メモリリヌク

メモリ解攟挏れ.

🔖メモリ砎壊

allocator

Explicit allocator

C の malloc や free で動的に取埗・開攟される.

Inplicit allocator

アプリケヌションによっお獲埗されるが, 開攟されない.

Java のガベヌゞ・コレクション.

Topics

👚デニス・リッチヌ

  • ベル研究所
  • C蚀語のパパ.

📚プログラミング蚀語C - ブラむアン・カヌニハン/デニス・リッチヌ

K&Rず略す.

歎史的プログラミング蚀語の名著. 🔖Hello worldはここから始たった.

わたしも持っおたけど売华した.

🊊C蚀語with me

わたしのはじめお孊んだプログラミング蚀語

🔵プログラミングの勉匷で高2の倏䌑みにC蚀語を孊んだ(2003/08)