2012-08-23 68 views
16

Làm thế nào để chuyển đổi một số nguyên thành vector nhị phân bằng cách sử dụng R?Làm thế nào để chuyển đổi số nguyên thành vector nhị phân?

Ví dụ:

number <- 11 
[1] 1 0 1 1 

là những gì các phương pháp nhanh nhất có thể chuyển đổi (sử dụng mã R hoặc một số chức năng hiện tại từ gói) nếu tôi cần phải chuyển đổi toàn bộ vector số (giá trị tối thiểu = 0, tối đa = 300) vào ma trận nhị phân?

Trả lời

19

Có những intToBits chức năng có thể chuyển đổi bất kỳ số nguyên cho một vector của 32 RAWS, vì vậy bạn có thể làm điều này:

decimals <- c(3,5,11,4) 
m <- sapply(decimals,function(x){ as.integer(intToBits(x))}) 
m 

> m 
     [,1] [,2] [,3] [,4] 
[1,] 1 1 1 0 
[2,] 1 0 1 0 
[3,] 0 1 0 1 
[4,] 0 0 1 0 
[5,] 0 0 0 0 
[6,] 0 0 0 0 
[7,] 0 0 0 0 
[8,] 0 0 0 0 
[9,] 0 0 0 0 
[10,] 0 0 0 0 
[11,] 0 0 0 0 
[12,] 0 0 0 0 
[13,] 0 0 0 0 
[14,] 0 0 0 0 
[15,] 0 0 0 0 
[16,] 0 0 0 0 
[17,] 0 0 0 0 
[18,] 0 0 0 0 
[19,] 0 0 0 0 
[20,] 0 0 0 0 
[21,] 0 0 0 0 
[22,] 0 0 0 0 
[23,] 0 0 0 0 
[24,] 0 0 0 0 
[25,] 0 0 0 0 
[26,] 0 0 0 0 
[27,] 0 0 0 0 
[28,] 0 0 0 0 
[29,] 0 0 0 0 
[30,] 0 0 0 0 
[31,] 0 0 0 0 
[32,] 0 0 0 0 
+0

không nên xếp hàng thứ 3 là 1011? – nikpod

+0

@nikpod Bạn muốn đảo ngược cột thứ 3, đó là '0000 ... 00001011' – digEmAll

+0

xấu của tôi, đang xem xét hàng đó một cách khôn ngoan. Các số 5 và 4 được biểu diễn ngẫu nhiên trong các hàng cũng như – nikpod

17

Điều này SO post đề xuất chức năng intToBits. Tôi xác định hàm number2binary, bao gồm đối số noBits để kiểm soát số lượng bit được trả về. Chuẩn là trả lại 32 bit.

number2binary = function(number, noBits) { 
     binary_vector = rev(as.numeric(intToBits(number))) 
     if(missing(noBits)) { 
      return(binary_vector) 
     } else { 
      binary_vector[-(1:(length(binary_vector) - noBits))] 
     } 
    } 

Và đối với một số ví dụ:

> number2binary(11) 
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 
> number2binary(11, 4) 
[1] 1 0 1 1 
+0

tôi nhận được 'chiều dài (number2binary (0, 32)) == 31' ...? –

5

Bạn có thể sử dụng chức năng sau cho điều đó, dựa trên intToBit:

intToBitVect <- function(x){ 
    tmp <- rev(as.numeric(intToBits(x))) 
    id <- seq_len(match(1,tmp,length(tmp))-1) 
    tmp[-id] 
} 

Dòng đầu tiên chuyển đổi đầu ra intToBits thành số 0 và 1 và đặt hàng thẳng. Dòng thứ hai kiểm tra các giá trị nào cần được giữ lại, như sau:

  • kiểm tra nơi xảy ra lần đầu tiên sử dụng match. Nếu không tìm thấy số 1, bạn hãy yêu cầu match để trả về độ dài của tmp vectơ của bạn.
  • tạo ra một chuỗi (sử dụng seq_len) từ 1 đến vị trí trước đó đến sự xuất hiện đầu tiên của 1 trong tmp vector
  • thả tất cả những vị trí trong tmp vector

Để hiển thị hoạt động:

> intToBitVect(11) 
[1] 1 0 1 1 
> intToBitVect(0) 
[1] 0 
7

Giải pháp tôi đã tìm thấy trong "Sách R" của MJ Crawley là chức năng sau:

binary <- function(x) { 
    i <- 0 
    string <- numeric(32) 
    while(x > 0) { 
    string[32 - i] <- x %% 2 
    x <- x %/% 2 
    i <- i + 1 
    } 
    first <- match(1, string) 
    string[first:32] 
} 
+0

Chức năng này rất tuyệt vời !!! Đó là giải pháp tổng quát nhất .. Kudos !! –

2

Nếu bạn muốn trả về một chuỗi nhị phân, tức là vectơ 1 và 0, thì chức năng này sẽ làm điều đó cho bạn, nhưng nó chỉ có thể lấy 1 số cùng một lúc.

dectobin <- function(y) { 
    # find the binary sequence corresponding to the decimal number 'y' 
    stopifnot(length(y) == 1, mode(y) == 'numeric') 
    q1 <- (y/2) %/% 1 
    r <- y - q1 * 2 
    res = c(r) 
    while (q1 >= 1) { 
    q2 <- (q1/2) %/% 1 
    r <- q1 - q2 * 2 
    q1 <- q2 
    res = c(r, res) 
    } 
    return(res) 
} 
1

Và khác:

toBits <- function (x, nBits = 8){ 
    tail(rev(as.numeric(intToBits(x))),nBits) 
} 
0
intToBin <- function(x){ 
    if (x == 1) 
    1 
    else if (x == 0) 
    NULL 
    else { 
    mod <- x %% 2 
    c(intToBin((x-mod) %/% 2), mod) 
    } 
} 

Vì vậy intToBin (10) trả

[1] "1" "0" "1" "0" 

Và nếu bạn muốn chuỗi thay vì vector

> paste0(intToBin(10), collapse = "") 
[1] "1010" 
2

Hãy thử gói cran "binaryLogic"

library(binaryLogic) 

as.binary(11) 
[1] 1 0 1 1 

as.binary(11, littleEndian=TRUE) 
[1] 1 1 0 1 

as.binary(42, n=16) 
[1] 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 

as.binary(0:2, n=2) 
[[1]] 
[1] 0 0 

[[2]] 
[1] 0 1 

[[3]] 
[1] 1 0 

as.binary(0xFF) 
[1] 1 1 1 1 1 1 1 1 

Cũng có sẵn: sự thay đổi, xoay, graycode, vv

Các vấn đề liên quan