Java에서 이진 문자열을 기본 10 정수로 변환하는 방법
이진수 숫자(선행 0 없음)를 나타내는 문자열 배열이 있으며, 해당 문자열의 기본 10개 숫자로 변환하려고 합니다.고려사항:
binary 1011 becomes integer 11
binary 1001 becomes integer 9
binary 11 becomes integer 3 etc.
어떻게 진행하면 좋을까요?java.lang.number에 대해 알아봤는데* 직접 변환 방법을 찾지 못했습니다. Integer.parseInt(b)
는 String...과 같은 정수를 생성합니다.예를 들어 1001이 9가 아닌 1,001이 되고 출력 베이스에 대한 파라미터가 포함되지 않은 것 같습니다. toBinaryString
는 잘못된 방향으로 변환합니다.다단계 변환이 필요할 것 같은데 메서드나 서브클래스의 적절한 조합을 찾을 수 없는 것 같습니다.나는 또한 선행 0이나 그것의 부족이 어느 정도까지 문제가 될 지 확신할 수 없다.길 안내해줄 사람 있어요?
기수를 지정해야 합니다.가 과부하되어 있다Integer#parseInt()
그렇게 할 수 있습니다.
int foo = Integer.parseInt("1001", 2);
다음과 같이 동작할 수 있습니다.
public int binaryToInteger(String binary) {
char[] numbers = binary.toCharArray();
int result = 0;
for(int i=numbers.length - 1; i>=0; i--)
if(numbers[i]=='1')
result += Math.pow(2, (numbers.length-i - 1));
return result;
}
int foo = Integer.parseInt("1001", 2);
양수를 취급하고 있는 경우는 정상적으로 동작합니다만, 서명된 번호를 취급할 필요가 있는 경우는, 문자열을 확장해, Int로 변환할 필요가 있습니다.
public class bit_fun {
public static void main(String[] args) {
int x= (int)Long.parseLong("FFFFFFFF", 16);
System.out.println("x =" +x);
System.out.println(signExtend("1"));
x= (int)Long.parseLong(signExtend("1"), 2);
System.out.println("x =" +x);
System.out.println(signExtend("0"));
x= (int)Long.parseLong(signExtend("0"), 2);
System.out.println("x =" +x);
System.out.println(signExtend("1000"));
x= (int)Long.parseLong(signExtend("1000"), 2);
System.out.println("x =" +x);
System.out.println(signExtend("01000"));
x= (int)Long.parseLong(signExtend("01000"), 2);
System.out.println("x =" +x);
}
private static String signExtend(String str){
//TODO add bounds checking
int n=32-str.length();
char[] sign_ext = new char[n];
Arrays.fill(sign_ext, str.charAt(0));
return new String(sign_ext)+str;
}
}
output:
x =-1
11111111111111111111111111111111
x =-1
00000000000000000000000000000000
x =0
11111111111111111111111111111000
x =-8
00000000000000000000000000001000
x =8
도움이 됐으면 좋겠네요!
static int binaryToInt (String binary){
char []cA = binary.toCharArray();
int result = 0;
for (int i = cA.length-1;i>=0;i--){
//111 , length = 3, i = 2, 2^(3-3) + 2^(3-2)
// 0 1
if(cA[i]=='1') result+=Math.pow(2, cA.length-i-1);
}
return result;
}
public Integer binaryToInteger(String binary){
char[] numbers = binary.toCharArray();
Integer result = 0;
int count = 0;
for(int i=numbers.length-1;i>=0;i--){
if(numbers[i]=='1')result+=(int)Math.pow(2, count);
count++;
}
return result;
}
난 더 지루할 것 같아!올바르게 기능하도록 Hassan의 답변을 수정했습니다.
나에겐 번호가 있어Format Exception(음수 처리 시).음수와 양수는 다음과 같이 사용했습니다.
System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));
Output : -9
비트 시프트를 사용하는 것이 보다 우아하고 빠르다.Math.pow
숫자(0 또는 1)를 비트 시프트하여val <<= 1
// parse an unsigned binary string, valid up to 31 bits
static int binaryToBase10(String binaryString) {
int val = 0;
for (char c : binaryString.toCharArray()) {
val <<= 1;
val += c-'0';
}
return val;
}
사용 예
int val = binaryToBase10("1011");
System.out.println(val);
인쇄 11
음수로 동작하도록 Java의 Integer.parseInt(텍스트)의 고정 버전:
public static int parseInt(String binary) {
if (binary.length() < Integer.SIZE) return Integer.parseInt(binary, 2);
int result = 0;
byte[] bytes = binary.getBytes();
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] == 49) {
result = result | (1 << (bytes.length - 1 - i));
}
}
return result;
}
난 루프가 좋아!아싸!
String myString = "1001001"; //73
어큐뮬레이터를 사용하여 루프하는 동안 왼쪽에서 오른쪽으로(l
변경되지 않음):
int n = 0,
j = -1,
l = myString.length();
while (++j < l) n = (n << 1) + (myString.charAt(j) == '0' ? 0 : 1);
return n;
오른쪽에서 왼쪽으로 2개의 루프 변수와 함께 Java에서 부울을 int로 변환(절대 끔찍함):
int n = 0,
j = myString.length,
i = 1;
while (j-- != 0) n -= (i = i << 1) * new Boolean(myString.charAt(j) == '0').compareTo(true);
return n >> 1;
다소 합리적인 구현:
int n = 0,
j = myString.length(),
i = 1;
while (j-- != 0) n += (i = i << 1) * (myString.charAt(j) == '0' ? 0 : 1);
return n >> 1;
판독 가능한 버전:p
int n = 0;
for (int j = 0; j < myString.length(); j++) {
n *= 2;
n += myString.charAt(j) == '0' ? 0 : 1;
}
return n;
이제 이진 문자열에서 10진수까지를 수행하려고 하는데, 그 반대의 메서드가 필요할 수 있습니다.밑에 있어요.
public static String decimalToBinaryString(int value) {
String str = "";
while(value > 0) {
if(value % 2 == 1) {
str = "1"+str;
} else {
str = "0"+str;
}
value /= 2;
}
return str;
}
문자열이 지정된 경우 이 방법을 사용하여 이진수를 10진수 정수로 변환할 수도 있습니다.(자바어)
static int binaryTodecimal(String s){
int i= -1;
char[] str = s.toCharArray();
int dec_val= 0;
for (int j=str.length-1; j>=0 ;j-- ){
int k= Integer.valueOf(str[j]) - '0';
i = i+1;
dec_val += k*(Math.pow(2, i));
}
System.out.println(dec_val);
}
퍼포먼스가 걱정된다면Integer.parseInt()
그리고.Math.pow()
너무 비싸요.비트 조작을 사용하여 동일한 작업을 2배 빠르게 수행할 수 있습니다(내 경험에 따르면).
final int num = 87;
String biStr = Integer.toBinaryString(num);
System.out.println(" Input Number: " + num + " toBinary "+ biStr);
int dec = binaryStringToDecimal(biStr);
System.out.println("Output Number: " + dec + " toBinary "+Integer.toBinaryString(dec));
어디에
int binaryStringToDecimal(String biString){
int n = biString.length();
int decimal = 0;
for (int d = 0; d < n; d++){
// append a bit=0 (i.e. shift left)
decimal = decimal << 1;
// if biStr[d] is 1, flip last added bit=0 to 1
if (biString.charAt(d) == '1'){
decimal = decimal | 1; // e.g. dec = 110 | (00)1 = 111
}
}
return decimal;
}
출력:
Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
언급URL : https://stackoverflow.com/questions/10178980/how-to-convert-a-binary-string-to-a-base-10-integer-in-java
'source' 카테고리의 다른 글
Linux에서 C에서 현재 시간을 밀리초 단위로 가져오려면 어떻게 해야 합니까? (0) | 2022.09.03 |
---|---|
경량 Java 객체 캐시 API (0) | 2022.09.03 |
Eclipse, ADT 22.6에서 Android Virtual Devices(AVD)를 만들거나 편집할 수 없음 (0) | 2022.09.03 |
Vue.js는 이름에 점이 있는 DOM 커스텀이벤트에 바인드(부트스트랩이벤트 등) (0) | 2022.09.03 |
vuejs 앱을 마우스 오른쪽 버튼으로 클릭할 때 오류 발생 (0) | 2022.09.03 |