ビット単位の演算子のみを使用して加算 (または算術演算) を実行する方法はありますか?
3 に答える
算術演算子のハードウェア設計を検索できます。加算の例として、全加算器、半加算器、リップルキャリー加算器、キャリー保存加算器、キャリー先読み加算器があります。次に、ビット単位の演算子を使用してこれらの算術演算を実行するコードを大量に生成できます。
ビットa、b、c の追加
carry_out = b&c|a&b|a&c; // there's a carry, if at least 2 bits are set
sum = a^b^c; // the sum is the number of set bits modulo 2
ワード内のすべてのビットに対してこれを実行する必要があります。最初に、carry_in = c = 0 を使用してビット 0 を実行し、carry_in(next_bit) = Carry_out(previous_result) まで繰り返します。
(ab)からbをビット反転し、最初のキャリーを 1 に設定すると、減算が行われます。
ただし、たとえば 32 個の数値を並列に追加する必要がある場合は、これらすべての数値の 32 個の lsbs を 'a' に当てはめ、バイナリ演算を並列に実行できます。これはビットスライスと呼ばれる技術です。
乗算CSAの場合(キャリーセーブアダーは間違いなく最良のソフトウェアアプローチです-最小の「面積」を持っています)
演習として、a+b(+c) を並列に計算するアルゴリズムを次に示します。
int a = 13113;
int b = 43334;
int c = 1;
int main()
{
int sum=a^b^c,c2;
c=((c&a)|(a&b)|(c&b))<<1;
while (c) {
c2=(c&sum)<<1;
sum^=c;
c=c2;
}
printf("%d\n",sum);
}
bitwise
演算子 inはnot on にC
のみ適用されることに注意してくださいintegral operands
arithmetic operands
bitwise
はい、すべての操作に使用できます(+,-,*,/,%)
例えば
int a =10;
a<<1; // it's multiplication : a*2
a>>1; //it's division : a/2
私はこれ2
だけを示しました。FULL ADDER
(SUM and CARRY functios)
任意の数のビットに対して を使用して、2 つの整数の加算を行うことができます。