1

たとえば、ビット演算子を使用して、を削除2123て返すにはどうすればよいですか?13私はこれを行う方法がわかりません..それは可能ですか?前もって感謝します。

4

4 に答える 4

3

あなたが提案していることは可能ですが、実際には意味がありません。以下はビット単位の値表現です(関連するビットのみを示し、さらに残っているものはすべてゼロです):

2:000010 || 123:1111011 || 13:001101

ビット演算で123を13に変更する論理的な方法はありません。文字列または文字配列に変換し、2つを削除してから、intにキャストし直すことをお勧めします。

于 2012-06-08T04:36:42.063 に答える
2

他にどのようなケースがありますか?ある種のパターンがある場合は、これを整数レベルで一般化することが可能かもしれません。そうでない場合は、実際には文字列の置換を見ているだけです。

2in123は実際には2E1 (10100)であり、in21234、少なくともビット単位の形式で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

于 2012-06-08T05:01:24.937 に答える
0

10進数で作業しているので、2進数での操作は控えめに言っても醜いです。いくつかの数学を使用して、kからn番目の桁を削除し、シフトオーバーすると

(k/pow(10,n))*pow(10, n-1) + k%pow(10, n-1)

基数2では、<<and>>演算子は、を乗算するように機能し、マスクを使用すると、の機能をpow(2, n)実行しますが、基数10ではビットが整列しません。&%

于 2012-06-08T05:20:38.273 に答える
0

これは非常に厄介ですが、実際にビット単位の演算のみを行う必要がある場合は、数値をBCDに変換することをお勧めします。BCDに入ると、基本的に0から9までの数字の16進数があるため、数字を削除するのは非常に簡単です。完了したら、バイナリに変換し直します。

誰もがそうしたいとは思わない。

于 2012-06-08T06:20:25.837 に答える