Je l'ai fait moi-même pendant un moment, alors prends note
Il a été utilisé lors de l'exécution d'un algorithme génétique. Je me sens mieux. .. .. En prime, j'ai fait une simple conversion décimale-binaire et une conversion de code gris. Il est facile d'utiliser des chaînes de bits, mais avec le sens de la pratique.
Tout d'abord, le code C (partie). Le retrait est cassé, mais j'ai écrit le même processus plusieurs fois, mais les règles de dénomination sont aléatoires, mais comme point de départ. C'est un peu long, mais c'est pareil.
Au fait, j'ai passé la liste du côté Python et l'ai reçue du côté C. Le programme est difficile ...
Référence (principalement liée à l'API) http://stackoverflow.com/questions/5079570/writing-a-python-c-extension-how-to-correctly-load-a-pylistobject
http://rokujyouhitoma.hatenablog.com/entry/20100704/1278216557
http://www.hexacosa.net/documents/python-extending/
Référence (calcul de bits, etc.) http://saeki-ce.xsrv.jp/index.html
Autre wiki etc.
cbinary.c
#include <Python.h>
#define LOWER_BOUND 0
#define UPPER_BOUND 1000
#define MAX_BIT_LENGTH 10
int binaryToValue(int *);
static PyObject *
valueToGray(PyObject *self, PyObject *args)
{
//return gray code
int i, n, m, len;
unsigned int num;
int b[MAX_BIT_LENGTH];
PyListObject *binary;
binary = (PyListObject *) PyList_New(MAX_BIT_LENGTH);
if (!PyArg_ParseTuple(args, "i", &num)){
return NULL;
}
n = (num >> 1) ^ num; //Convertir en code gris
//Convertir en binaire
for (i=0; n>0; i++){
m=n%2; //Divisé par 2
n=n/2; //Diviser par 2
b[i] = m;
}
len = i; //Longueur lors de la conversion en binaire d'un entier
//Ajoutez 0 à l'épée pour qu'elle devienne 10 bits
for (i=len; i<MAX_BIT_LENGTH; i++ ){
b[i] = 0;
}
//Copiez la chaîne de bits qui était dans l'ordre inverse dans l'ordre binaire
n = 0;
for (i=MAX_BIT_LENGTH-1; i>=0; i--){
//Mettre une valeur de type int en gris un bit à la fois
PyList_SET_ITEM(binary, n++, Py_BuildValue("i", b[i]));
}
return Py_BuildValue("O", binary);
}
static PyObject *
make_individual(PyObject *self, PyObject *args)
{
int b[MAX_BIT_LENGTH];
int m,n,i,len;
unsigned int min, max;
unsigned int random_int;
unsigned int gray_int;
PyListObject *gray; //Représenter un objet de liste python
gray = (PyListObject *) PyList_New(MAX_BIT_LENGTH); //La taille est MAX~Faire une liste de
if (!PyArg_ParseTuple(args, "ii", &min, &max)){ //Lorsqu'il y a plusieurs arguments, écrivez-les côte à côte comme ii
return NULL;
}
if (min < LOWER_BOUND){
exit(0);
}
else if (max > UPPER_BOUND){
exit(0);
}
//Générer des nombres entiers aléatoirement
random_int = min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
gray_int = (random_int >> 1) ^ random_int; //Convertir en code gris
n = gray_int;
//Convertir en binaire
for (i=0; n>0; i++){
m=n%2; //Divisé par 2
n=n/2; //Diviser par 2
b[i] = m;
}
len = i; //Longueur lors de la conversion en binaire d'un entier
//Ajoutez 0 à l'épée pour qu'elle devienne 10 bits
for (i=len; i<MAX_BIT_LENGTH; i++ ){
b[i] = 0;
}
//Copiez la chaîne de bits qui était dans l'ordre inverse dans l'ordre binaire
n = 0;
for (i=MAX_BIT_LENGTH-1; i>=0; i--){
//Mettre une valeur de type int en gris un bit à la fois
PyList_SET_ITEM(gray, n++, Py_BuildValue("i", b[i]));
}
return Py_BuildValue("O", gray);
}
static PyObject *
grayToBinary(PyObject *self, PyObject *args)
{
unsigned int num;
unsigned int mask;
int m,n,i,len;
int b[MAX_BIT_LENGTH], inputed_binary[MAX_BIT_LENGTH];
PyListObject *binary; //Représenter un objet de liste python
PyObject *get_list;
binary = (PyListObject *) PyList_New(MAX_BIT_LENGTH);
if (!PyArg_ParseTuple(args, "O", &get_list )){
return NULL;
}
if PyList_Check(get_list) {
for (i=0; i<PyList_Size(get_list); i++){
//Extraire le contenu de l'objet liste lors de sa conversion pour qu'il soit visible en C?(Pas de confiance)
inputed_binary[i] = PyInt_AsSsize_t(PyList_GetItem(get_list, (Py_ssize_t)i)); //ok
}
}
num = binaryToValue(inputed_binary);
for (mask = num >> 1; mask != 0; mask = mask >> 1){
//Annuler du code gris
num = num ^ mask;
}
n = num;
//Convertir en binaire
for (i=0; n>0; i++){
m=n%2; //Divisé par 2
n=n/2; //Diviser par 2
b[i] = m;
}
len = i; //Longueur lors de la conversion en binaire d'un entier
//Ajoutez 0 à l'épée pour qu'elle devienne 10 bits
for (i=len; i<MAX_BIT_LENGTH; i++ ){
b[i] = 0;
}
//Copiez la chaîne de bits qui était dans l'ordre inverse dans l'ordre binaire
n = 0;
for (i=MAX_BIT_LENGTH-1; i>=0; i--){
//Entrez une valeur de type int en binaire un bit à la fois
PyList_SET_ITEM(binary, n++, Py_BuildValue("i", b[i]));
}
return Py_BuildValue("O", binary);
}
int binaryToValue(int *b){
//Convertir le binaire en entier
int i,n;
i=0; n=0;
while(i < MAX_BIT_LENGTH){
if (b[i] == 1) n+=1;
i+=1;
if (i == MAX_BIT_LENGTH) break;
n=n*2;
//printf("%d\n", n);
}
return n;
}
static PyObject *
binaryToPtype(PyObject *self, PyObject *args)
{
int i,n;
int inputed_binary[MAX_BIT_LENGTH];
PyListObject *binary; //Représenter un objet de liste python
PyObject *get_list;
if (!PyArg_ParseTuple(args, "O", &get_list )){ //Passez l'objet python tel quel
return NULL;
}
if PyList_Check(get_list) {
for (i=0; i<PyList_Size(get_list); i++){
inputed_binary[i] = PyInt_AsSsize_t(PyList_GetItem(get_list, (Py_ssize_t)i)); //ok
}
}
i=0; n=0;
while(i < MAX_BIT_LENGTH){
if (inputed_binary[i] == 1) n+=1;
i+=1;
if (i == MAX_BIT_LENGTH) break;
n=n*2;
//printf("%d\n", n);
}
return Py_BuildValue("i", n);
}
static PyObject *
hello(PyObject *self)
{
printf("Hello World!!\n");
Py_RETURN_NONE;
}
static char ext_doc[] = "C extention module example\n";
static PyMethodDef methods[] = {
{"hello", (PyCFunction)hello, METH_NOARGS, "print hello world.\n"},
{"value_to_gray", valueToGray, METH_VARARGS, "return gray obj.\n"},
{"make_individual", make_individual, METH_VARARGS, "return gray code.\n"},
{"gray_to_binary", grayToBinary, METH_VARARGS, "return binary code.\n"},
{"binary_to_ptype", binaryToPtype, METH_VARARGS, "return ptype value.\n"},
{NULL, NULL, 0, NULL}
};
void initcbinarymethods(void)
{
Py_InitModule3("cbinarymethods", methods, ext_doc);
}
Comme d'habitude, écrivez setup.py.
setup.py
from distutils.core import setup, Extension
module1 = Extension('cbinarymethods',
sources = ['cbinary.c'])
setup (name = 'cbinarymethods',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1])
Encore une fois, construisez sur la ligne de commande comme d'habitude.
$ python setup.py build_ext --inplace #--Ajouter en place pour le rendre actuel.Il semble que cela puisse être fait
Si vous pouvez le construire avec succès, vous aurez cbinarymethods.so.
Importons-le avec python et utilisons-le
>>> import cbinarymethods as cbm
>>> i = cbm.make_individual(200, 250)
>>> i
[0, 0, 1, 0, 0, 0, 1, 0, 1, 1]
>>> a = cbm.gray_to_binary([0,0,1,0,1,0,0,1,0,1])
>>> a
[0, 0, 1, 1, 0, 0, 0, 1, 1, 0]
Recommended Posts