Home > Erlang探索 > hipe_bifs:bitarray的使用

hipe_bifs:bitarray的使用

September 20th, 2010

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: hipe_bifs:bitarray的使用

未公开的hipe_bifs:bitarray是内置的,用c语言实现的, inplace修改的,有非常高的效率.

-module(bitarray).
-export([new/1, set/2, get/2]).

new(Size) -> hipe_bifs:bitarray(Size, false).
set(I, A) -> hipe_bifs:bitarray_update(A, I, true).
get(I, A) -> hipe_bifs:bitarray_sub(A, I).

相比之下用纯erlang array模块实现的bitarray的版本

-module(bitarray).
-export([new/1, set/2, get/2]).

-define(W, 24).

new(N) -> array:new((N-1) div ?W + 1, {default, 0}).

set(I, A) ->
  AI = I div ?W,
  V = array:get(AI, A),
  V1 = V bor (1 bsl (I rem ?W)),
  array:set(AI, V1, A).

get(I, A) ->
  AI = I div ?W,
  V = array:get(AI, A),
  V band (1 bsl (I rem ?W)) =/= 0.

大家看着用把…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: ,
  1. Hawk
    January 4th, 2015 at 18:30 | #1

    您好,在看到hipe_bifs:bitarray这种形式的时候,我就在想如果能直接修改list的数据的话,那样将非常方便,所以我就看了一下hipe_bifs:bitarray的实现,发现也有类似的函数,hipe_bifs:array, hipe_bifs:bytearray,发现在C的代码里可以直接获取到内存地址,所以我就想用nif,看是否能够获取list的内存地址。关于ERL_NIF_TERM的转换,我在网上找到了一遍文章http://blog.csdn.net/zhongruixian/article/details/9406019, 根据文章所介绍的,就能够找到ERL_NIF_TERM的内部数据。因为list的内部是用链表实现的,将ERL_NIF_TERM转换后可以得到一个数组Array,Array[0]是数据,Array[1]是next指针,即使我强制使next=0,可在erlang层面的数据却根本没有改变,所以我想问是否有其它的方法可以直接修改list中的数据,而不用每一次的修改都做一次拷贝。

Comments are closed.