리버스 비트

난이도 쉽게
자주 묻는 질문 Apple 구글 삼성
비트 비트 조작 비트조회수 127

주어진 32 비트 부호없는 정수의 비트 반전.

입력

43261596 (00000010100101000001111010011100)

산출

964176192 (00111001011110000010100101000000)

32 비트 부호없는 정수는 각 문자가 '32'또는 '0'이 될 수있는 1 자의 문자열로 표현할 수있는 음이 아닌 숫자를 나타냅니다.

암호알고리즘

  1. 0에서 15 사이의 i에 대해
    • 처음과 끝에서 i 번째 비트가 동일하지 않으면 뒤집습니다.
  2. 이진수로 숫자를 인쇄하십시오.

설명

  1. 비트가 같을 때 교체해도 최종 답이 바뀌지 않기 때문에 서로 다른 경우에만 비트를 교체합니다.
  2. 두 개의 다른 비트를 교환하려면 XOR을 사용하여 개인의 비트를 뒤집습니다. 연산자.

리버스 비트

실시

리버스 비트 용 C ++ 프로그램

#include <bits/stdc++.h>
using namespace std;
void Reverse(uint32_t n)
{
    for (int i = 0; i < 16; i++)
    {
        bool temp = (n & (1 << i));
        bool temp1 = (n & (1 << (31 - i)));
        if (temp1 != temp)
        {
            n ^= (1 << i);
            n ^= (1 << (31 - i));
        }
    }
    for (int i = 31; i >= 0; i--)
    {
        bool temp = (n & (1 << i));
        cout << temp;
    }
    cout << endl;
}
int main()
{
    uint32_t n;
    cin >> n;
    Reverse(n);
    return 0;
}
43261596
00111001011110000010100101000000

리버스 비트 용 JAVA 프로그램

import java.util.*;

public class Main
{
    public static void Reverse(int n)
    {
        for (int i = 0; i < 16; i++)
        {
            int temp = (n & (1 << i));
            temp = temp==0? 0: 1;
            int temp1 = (n & (1 << (31 - i)));
            temp1 = temp1==0? 0: 1;
            if (temp1 != temp)
            {
                n ^= (1 << i);
                n ^= (1 << (31 - i));
            }
        }
        for (int i = 31; i >= 0; i--)
        {
            int temp = (n & (1 << i));
            temp = temp==0? 0: 1;
            System.out.print(temp);
        }
    }
  public static void main(String[] args) {
    Scanner sc = new Scanner( System.in ) ;
    int n=sc.nextInt();
    Reverse(n);
  }
}


3456785
10001000111111010010110000000000

역방향 비트에 대한 복잡성 분석

시간 복잡성

우리는 16 비트에서만 횡단하므로 시간 복잡성 기본적으로 O (16) 인 O (1)입니다.

공간 복잡성

1 개의 추가 bool 유형 변수 만 사용했기 때문에 O (2)이기도합니다.

역방향 비트의 변형

  • 이 질문에서 우리는 주어진 부호없는 정수의 비트를 뒤집도록 요청 받았지만, 주어진 부호없는 정수의 보수를 찾기 위해 같은 질문을 수정할 수 있습니다.

자, 주어진 숫자의 보수는 무엇입니까?

A number obtained by toggling the state of each binary character in the given binary representation of integer is known as the complement of that number.

따라서 주어진 이진 문자열에서 모든 0을 1로, 모든 1을 0으로 간단히 변경할 수 있습니다.

주어진 숫자가 20이면 이진 표현은 10100이됩니다.

따라서 보완은 01011입니다.

실시

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n = 20;
    string ans;
    while(n){
        if(n%2==0){
            ans = '1'+ans;
        }
        else{
            ans = '0'+ans;
        }
        n/=2;
    }
    cout<<"Complement of the given number is: "<<ans;
}
Complement of the given number is: 01011
  • 두 개의 이진 문자열을 추가하는 것과 같이 정수의 이진 표현에 대해 많은 질문을 할 수 있습니다. 이러한 종류의 질문을 해결하려면 이진 덧셈의 규칙에 대해 알아야합니다.

추가 규칙 :

이 테이블을 진리표라고합니다. 더하기, 빼기 등과 같은 이진 비트 연산의 출력을 찾는 데 사용됩니다.

  • 비트 연산 및 이진 표현과 관련된 더 복잡한 문제는 경쟁 프로그래밍에서 일반적으로 요구되는 비트 조작의 영향을받습니다.

그러나 비트 조작의 기본은 서로 다른 데이터 구조가 이진 형식으로 표현되는 방식입니다.

참조

Translate »