Python 3で整数に設定された最下位ビットの位置を返す最速の方法は何ですか?に似た質問があります。、2進数で最初のセットビットを見つけること、および位置が設定されている最下位ビットのR.で整数の最下位セットビットの位置を見つけるために、R. Iの必要性のためにより提案された解決策シュペッツレは以下のとおりであります:
unlist(lapply(x, function(z) min(which(as.integer(intToBits(z)) == 1))-1))
それを行うためのより効率的な方法はありますか?
あなたが長いベクトルを持っていて、C ++に行きたいなら、次のコードがあなたを助けるかもしれません(と一緒にRcpp
そしてffs
からの関数strings.h
):
#include <Rcpp.h>
#include <strings.h>
using namespace Rcpp;
// [[Rcpp::export]]
Rcpp::IntegerVector lsb(const IntegerVector x)
{
IntegerVector res(x.size());
std::transform(x.begin(), x.end(), res.begin(), ffs);
return(res-1); # To start from 0
}
上記のコードをファイルとして保存し、たとえばlsb.cpp
、パッケージsourceCpp("lsb.cpp")
からを使用してコンパイルしRcpp
ます。
わずかに高速です-少なくともオーバーヘッドが無視できるようになる長い入力ベクトルの場合
> x <- floor(runif(10000,1,2^31))
> microbenchmark::microbenchmark(f(x), g(x), lsb(x))
Unit: microseconds
expr min lq mean median uq max neval
f(x) 121.771 129.6360 168.91273 133.241 151.0110 1294.667 100
g(x) 36165.757 40508.1740 50371.45183 42608.686 60460.5270 94664.255 100
lsb(x) 25.767 26.8015 34.58856 33.035 35.2385 156.852 100
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加