Comment detail

2進数の記述 (Nested Flatten)

This comment is reply for 4577 梅紫蘇: カンマがいらない形で....。これ使うく...(2進数の記述). Go to thread root.

さっき同じこと実験しててハマりました。

最上位が0の場合8進数として認識されます。

ってことでマクロで修正。

あと最適化されないけど、文字列版も

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/*bin_n(00111100)と書きます。
*/
#define  bin_n(n) \
    ((((0##n%0100000000)/010000000)<<7)\
    +(((0##n%0010000000)/001000000)<<6)\
    +(((0##n%0001000000)/000100000)<<5)\
    +(((0##n%0000100000)/000010000)<<4)\
    +(((0##n%0000010000)/000001000)<<3)\
    +(((0##n%0000001000)/000000100)<<2)\
    +(((0##n%0000000100)/000000010)<<1)\
    +(((0##n%0000000010)/000000001)   ))

/*文字列使用版
こちらも同じくbin_s(00111100)と書きます。
*/
#define bin_s(str)\
    (((#str[0]-'0')<<7)+((#str[1]-'0')<<6)+((#str[2]-'0')<<5)\
    +((#str[3]-'0')<<4)+((#str[4]-'0')<<3)+((#str[5]-'0')<<2)\
    +((#str[6]-'0')<<1)+#str[7]-'0')
}

なるほど。 先頭0付けると8進数って、0x付けると16進数ってぇのと大差ない感覚だったんですけど。

マクロは、拡張も楽な感じ。(コードは試してません)

1
2
3
4
#define bin_8(a)                bin_n(a)
#define bin_16(a,b)             ((bin_8(a)<<8)|bin_8(b))
#define bin_32(a,b,c,d)         ((bin_16(a,b)<<16)|bin_16(c,d))
#define bin_64(a,b,c,d,e,f,g,h) ((bin_32(a,b,c,d)<<32)|bin_32(e,f,g,h))

Index

Feed

Other

Link

Pathtraq

loading...