在numpy中进行正向和反向位扫描

时间:2019-03-05 19:15:57

标签: python numpy binary bitboard

我需要计算numpy uint64变量中尾随和前导零的数目,所以现在我正在这样做:

<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_purple"
tools:context=".MainActivity">

<ImageButton
    android:id="@+id/single"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop"
    app:srcCompat="@drawable/imgthree" />

<ImageView
    android:id="@+id/withands"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:clickable="true"
    app:srcCompat="@drawable/imgsix" />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="98dp"
    android:alpha="0.7"
    android:background="@android:color/background_dark"
    android:onClick="change"
    android:text="find out the person"
    android:textColor="@android:color/holo_blue_bright" />
    </android.widget.RelativeLayout>

是否有一种更好的方法,而不使用字符串? 优先是速度。谢谢!

3 个答案:

答案 0 :(得分:1)

我不确定以下代码的速度。但是您当然可以这样做,而无需使用字符串。

n = np.uint64(100)
i=1
while((n>>np.uint64(i))%2==0):
    i+=1

trail_zeros=i

您将值n右移,直到得到一个奇数。右移次数等于trail_zeros

答案 1 :(得分:1)

对于pickle中的数字,我们可以使用一些算术运算以二进制格式获取前导和尾随零,从而跳过字符串操作-

[0,2**63)

答案 2 :(得分:0)

lead_zeros = int(64-np.ceil(np.log2(n)))

因为len(s)等于ceil(log2(n))。这是纯粹的算术运算,因此可以通过numpy进行向量化,并且比编写自己的循环快得多。

性能

performance_lead_zeros