たとえば、ビット演算子を使用して、を削除2
し123
て返すにはどうすればよいですか?13
私はこれを行う方法がわかりません..それは可能ですか?前もって感謝します。
4 に答える
あなたが提案していることは可能ですが、実際には意味がありません。以下はビット単位の値表現です(関連するビットのみを示し、さらに残っているものはすべてゼロです):
2:000010 || 123:1111011 || 13:001101
ビット演算で123を13に変更する論理的な方法はありません。文字列または文字配列に変換し、2つを削除してから、intにキャストし直すことをお勧めします。
他にどのようなケースがありますか?ある種のパターンがある場合は、これを整数レベルで一般化することが可能かもしれません。そうでない場合は、実際には文字列の置換を見ているだけです。
2
in123
は実際には2E1 (10100)
であり、in2
は1234
、少なくともビット単位の形式で2E2 (11001000)
は、どちらにも関連していません。2 (10)
また、削除された番号の左側の番号に、削除された番号の右側の「番号」を追加する必要があります/10。
つまり、123から13に移動するには:
Located "2".
Number on left (x): 100
Number on right (y): 3
y + (x / 10) = 13
そして1324年から134年に行く
Located "2"
Number on left (x): 1300
Number on right (y): 4
y + (x / 10) = 134
何らかのパターンがない限り(つまり、数字がどの位置にあるかがわかっている場合)、結果に対してを実行する前に.ToString()
、数字を実行してから、を実行する必要があります。.Replace("2", "")
int.Parse()
編集:誰かがこの答えに賛成し、以前の実装が不必要に複雑であることに気づきました。10進数の数字を「反復」するのは比較的簡単であり、再帰を必要としないはずです。
以下の新しいソリューションでは、パフォーマンスは向上していますが、これは非常に小さな最適化です。
static int OmitDigit(int number, int digit) {
var output = 0;
var multiplier = 1;
while (number > 0) {
var n = number % 10;
number /= 10;
if (n != digit) {
output += (n * multiplier);
multiplier *= 10;
}
}
return output;
}
結果:
1554443
10進数で作業しているので、2進数での操作は控えめに言っても醜いです。いくつかの数学を使用して、kからn番目の桁を削除し、シフトオーバーすると
(k/pow(10,n))*pow(10, n-1) + k%pow(10, n-1)
基数2では、<<
and>>
演算子は、を乗算するように機能し、マスクを使用すると、の機能をpow(2, n)
実行しますが、基数10ではビットが整列しません。&
%
これは非常に厄介ですが、実際にビット単位の演算のみを行う必要がある場合は、数値をBCDに変換することをお勧めします。BCDに入ると、基本的に0から9までの数字の16進数があるため、数字を削除するのは非常に簡単です。完了したら、バイナリに変換し直します。
誰もがそうしたいとは思わない。