int n = 1; //Arbitrary value
for ( int i = 0;i < 8;i++ )
{
printf( "%d",n & ( 1 << i ) ? 1 : 0 ); //Ternary
printf( "%d",0 || n & ( 1 << i ) ); //Logical OR
}
ループ内の2つの式のうち、バイナリ値の0または1の状態を出力するために使用するのにどちらが適切ですか?(基本的にバイナリ文字列表現を出力します)。
int n = 1; //Arbitrary value
for ( int i = 0;i < 8;i++ )
{
printf( "%d",n & ( 1 << i ) ? 1 : 0 ); //Ternary
printf( "%d",0 || n & ( 1 << i ) ); //Logical OR
}
ループ内の2つの式のうち、バイナリ値の0または1の状態を出力するために使用するのにどちらが適切ですか?(基本的にバイナリ文字列表現を出力します)。
最高だろう
(n >> i) & 0x1
「ブール」変換を行う他のどのメソッドよりも確実にブランチレスです。
可能かつ合理的な場合は、必要な結果を形成するために必要なビットが正しい位置に配置されるように、右にシフトすることをお勧めします。これにより、余分な手順が不要になります。
どう!!(n & (1 << i))
ですか?または(n & (1 << i)) != 0
?
私はそれらの両方があなたが作る提案よりも良い選択だと思います(そしていいえ、私は自分で!!を思いつきませんでした、私はそれをいくつかのコードで読んで、そこからそれを拾いました-それはかなり頻繁に使用されますたとえば、XenとLinuxの場合)
読みやすくするために、次のことを検討できます。
inline zero_or_one_bit(int n, int i)
{
return !!(n & (1 << i));
}
左にシフトする代わりに、右にシフトします。
for (int i = 7; i >= 0; --i)
printf("%d", (n >> i) & 1);
ただし、ある意味で1 << i
、マイクロコード化された命令の場合、それらはすべて非効率的である可能性があります(以下のコメントによると、これは明らかにありそうもないことです)。
これは、一定のシフトのみを行うバージョンです。
for (int i = 0, n2 = n; i < 8; i++, n2 <<= 1)
printf("%d", (n2 >> 7) & 1);
私はAndreyTの答えが好きですが、完全を期すために、その三項式から簡単にさらに多くの作業を得ることができます(そして、 %d のコストがどれほどかかるかに驚くかもしれません):
putc( (n & ( 1 << i ))!=0 ? '1' : '0', stdout );
はい、必要に応じて
putc( ((n>>i) & 1) + '0', stdout );