プロが教えるわが家の防犯対策術!

例えば、
整数N:1024
整数M:19
と入力されたときに、
Nのiビット目からjビット目にMを挿入するプログラムを作成したいです。

整数N(2進数):10000000000
整数M(2進数): 10011
i=2, j=6
結果      :10001001100

この場合は、Mをiの数だけ左シフトし(1001100)
ビットORでそのまま挿入できますが、

整数N(2進数):10000011100
整数M(2進数): 10011
i=2, j=6
結果      :10001001100

Nがこのようになった場合、ORでは結果のようにならないので、
Mを挿入するNの部分を0に置き換えておき、
そこにMを挿入するようにしたいです。

10000011100
↓ i(2)ビット目からj(6)ビット目までをすべて0に置き換え
10000000000

この、0に置き換えというのはどのようにコードを書けば実現できるでしょうか?
ご教示いただけますと幸いです。


現在のコード↓

import java.util.Scanner;

public class test {
public static void main(String[] args) {

//整数NとMを入力
Scanner scanner = new Scanner(System.in);
System.out.println("整数Nを入力");
int scanX = scanner.nextInt();
System.out.println("整数Mを入力");
int scanY = scanner.nextInt();

//ビットの位置を指す値iを入力
System.out.println("ビットの位置(始まり)を指す値iを入力");
int scanZ = scanner.nextInt();

//メソッドを呼び出す
int xyz = insert(scanX, scanY, scanZ);

//返された結果(NにMを挿入した結果)を出力する
System.out.println();
System.out.println("Nのjビット目からiビット目にMを挿入すると:" + Integer.toBinaryString(xyz));
}

//Nのjからiビット目にMを挿入するメソッド
public static int insert(int x, int y, int z) {
int N = x;
int M = y;
int i = z;

//j = i + (Mの長さ - 1)
int j = i + (String.valueOf(Integer.toBinaryString(M)).length() - 1);
System.out.println("ビットの位置(終わり)を指す値jは" + j);

//スキャナで受け取った整数NとMを2進数に変換
System.out.println();
System.out.println("N(" + N + ")を2進数にすると:" + Integer.toBinaryString(N)); //2進数
System.out.println("M(" + M + ")を2進数にすると:" + Integer.toBinaryString(M)); //2進数

//Mをiの数だけ左にシフト
M = M << i;
System.out.println("M(2進数)をi(" + i + ")だけ左にずらすと:" + Integer.toBinaryString(M));

//ビット演算をする
//もし挿入したい部分が1だったら0にする
ここに挿入するNの箇所を0にするコードを書きたいです

//NにMを挿入(どちらかが1の場合1を返す)
int xyz;
xyz = N | M;
//結果を返す
return xyz;
}
}

A 回答 (1件)

一般的にはマスクを使います


mask = ~(-1 << Mのビット幅)
結果 = N & ~(mask << i) | (M << i)
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!