サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
パリ五輪
tak5219.seesaa.net
ビットを数えるアルゴリズム by 矢口真里 浮気相手 (06/13) コンスタンティン(劇場) by 寺田誠知 (04/20) 日蝕! by 幸運の出会いNAVI (02/08) 日蝕! by 近 距 離 逆 援 セ レ ブ (02/03) 日蝕! by ご近所メール (01/27) あるビット列があったとき,その中にいくつ1が立っているかを調べるアルゴリズムがありますが,そのアルゴリズムがどうしてちゃんと動くのか考えてみました. http://wiki.livedoor.jp/ngr5_600/d/%A5%D3%A5%C3%A5%C8%A4%F2%BF%F4%A4%A8%A4%EB より int numofbits5(long bits) { bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555); bits = (bits & 0x3
printfのときはdoubleもfloatも%fなのにscanfは%lfと%fになるという話です. この問題を考えるとき,まず,printfやscanfがどういう関数かというのを確認しておく必要があります. つまり,これらの関数は可変引数であり,渡す引数の数や型が決まっていないということです. もうちょっと詳しく考えると,printfは,引数としてさまざまな型の数字をとり,それをフォーマットに従って表示します. 一方scanfは,さまざまな型の変数のポインタをとり,そこに,フォーマットにしたがって値を入れていきます. そもそも,関数に引数を渡すということは,値をスタックに積むということです. そして,C言語の場合はそれだけです. スタックに積んである値には型の情報もどこまでが引数かなんていう情報もありません. よって,それをどうにかして知る必要があります.それがprintfやscanfに
初めて見るとかなりビビるマクロ. 例えば, struct foo { int x; struct bar b1; }; struct foo f1, *f2; struct bar *b; b = &f1.b; なんてあるとき, f2 = container_of(b, struct foo, b1); なんてことができてしまう. もちろん,f2に入ってるのはf1のポインタ. ちなみに宣言は以下 include/linux/kernel.hより #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) include/linux/stddef.
このページを最初にブックマークしてみませんか?
『tak5219.seesaa.net』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く