我正在尝试开发一个系统,可以将我的字符串更改为唯一的整数值,这意味着例如单词"account"具有加密的数值0891,并且没有其他字可能转换为0891具有相同的转换过程,它不但是需要能够产生的整数转换回字符串.
同时它将依赖于单词结构规则,意味着诸如"准确性"和"公告"之类的单词将具有大于0891的生成数字,并且诸如"a","abacus"和"abbreviation"之类的单词将具有生成的数字小于0891.
此应用程序的目的是提供类似于索引或主键的服务.我没有使用增量索引的原因是出于安全目的,并且是由于索引依赖于集合中的数据数量
(例如)
[0] A, [1] B, [2] C, [3] D, [4] E, [5] F
Run Code Online (Sandbox Code Playgroud)
上面的字母有各自对应的索引,E的索引为4
但是,如果数据突然增加或减少,则排序
[0] A, [1] AA, [2] AAB, [3] C, [4] D, [5] DA, [6] DZ, [7] E, [8] F
Run Code Online (Sandbox Code Playgroud)
E现在的指数为7
每个单词必须具有唯一的独立整数等价物并具有相应的权重.
我需要知道是否存在可以执行上述操作的算法.
任何帮助将不胜感激.
我们本周在这里遇到了有趣的问题.
我们在C上使用哈佛架构嵌入式平台,该平台具有16位数据地址和32位代码地址.
使用函数指针时会出现此问题.如果你有像这样的代码
if (fp) fp();
Run Code Online (Sandbox Code Playgroud)
要么
if (fp != 0) fp();
Run Code Online (Sandbox Code Playgroud)
一切都好.
但是如果你有像这样的代码
if (fp != NULL) fp();
Run Code Online (Sandbox Code Playgroud)
然后,因为NULL定义为(void *) 0,编译器(在这种情况下为gcc)a)不警告,b)对函数指针进行16位比较而不是32位比较.只要你的函数指针没有发生在64k边界上,所以所有底部的16位都是0就很好.
目前我们有大量的代码包含对NULL的显式检查.它们中的大多数将是数据指针,但其中一些将是函数指针.快速grep != NULL或== NULL显示超过3000个结果,许多人通过手动检查.
那么,我们现在想要的也是
找到比较函数指针(但不是数据指针)的所有情况的方法(所以我们可以将它们与我们定义为32位0的FP_NULL进行比较),或者
以这样的方式重新定义NULL,以便它做正确的事情.
(或者,我想,更新我们的gcc端口以检测并正确处理这种情况).
我无法想到任何适用于1的方法.我能想到的唯一方法是将NULL重新定义为0函数指针,这对于绝大多数针对数据指针的比较来说都是非常浪费的.(32位比较是4条指令,16位比较是1条指令).
有什么想法或建议吗?
昨天我不得不解析一个非常简单的二进制数据文件 - 规则是,连续查找两个字节都是0xAA,然后下一个字节将是一个长度字节,然后跳过9个字节并输出给定数量的数据那里.重复到文件末尾.
我的解决方案确实有效,而且很快就能组合在一起(尽管我是一名C程序员,但我仍然认为用Python写这个比用C语言更快) - 但是,很明显根本不是Pythonic,它看起来像一个C程序(并不是一个非常好的程序!)
什么是更好/更Pythonic方法呢?像这样的简单FSM在Python中仍然是正确的选择吗?
我的解决方案
#! /usr/bin/python
import sys
f = open(sys.argv[1], "rb")
state = 0
if f:
for byte in f.read():
a = ord(byte)
if state == 0:
if a == 0xAA:
state = 1
elif state == 1:
if a == 0xAA:
state = 2
else:
state = 0
elif state == 2:
count = a;
skip = 9
state = 3
elif state == 3:
skip = skip -1
if skip == 0:
state …Run Code Online (Sandbox Code Playgroud) (我发现这个问题类似但不重复: 如何检查C编程语言中头文件的有效性)
我有一个函数实现,以及一个头文件中的不匹配原型(相同名称,不同类型).头文件包含在使用该函数的C文件中,但不包含在定义该函数的文件中.
这是一个最小的测试用例:
header.h:
void foo(int bar);
Run Code Online (Sandbox Code Playgroud)
FILE1.C:
#include "header.h"
int main (int argc, char * argv[])
{
int x = 1;
foo(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
档案2.c:
#include <stdio.h>
typedef struct {
int x;
int y;
} t_struct;
void foo (t_struct *p_bar)
{
printf("%x %x\n", p_bar->x, p_bar->y);
}
Run Code Online (Sandbox Code Playgroud)
我可以使用VS 2010编译它,没有任何错误或警告,但不出所料,当我运行它时会出现段错误.
我怎样才能发现这些错误?
[编辑:我意识到如果我在file2.c中#include"header.h",编译器会抱怨.但是我有一个巨大的代码库,并不总是可能或适当的保证函数原型的所有头都包含在实现文件中.
我已经编程C,主要是在嵌入式环境中,多年来一直有一个非常好的指针心理模型 - 我不必明确考虑如何使用它们,我对指针算法100%舒适,数组指针,指针指针等.
我写了很少的C++,并且没有很好的思考引用的方法.我过去曾被告知"将它们视为不能为空的指针",但这个问题表明这远不是完整的故事.
因此,对于更有经验的C++程序员 - 您如何看待参考?你认为它们是一种特殊的指针,还是完全属于自己的东西?对于C程序员来说,理解这个概念的好方法是什么?
我有一个关于指针解除引用速度的问题.我有这样的结构:
typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
double left;
double top;
double right;
double bottom;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,哪一个更快,为什么?
情况1:
TD_RECT *pRect;
...
for(i = 0; i < m; i++)
{
if(p[i].x < pRect->left) ...
if(p[i].x > pRect->right) ...
if(p[i].y < pRect->top) ...
if(p[i].y > pRect->bottom) ...
}
Run Code Online (Sandbox Code Playgroud)
案例2:
TD_RECT *pRect;
double left = pRect->left;
double top = pRect->top;
double right = pRect->right;
double bottom = pRect->bottom;
...
for(i = 0; i < m; i++)
{
if(p[i].x < left) ...
if(p[i].x …Run Code Online (Sandbox Code Playgroud) 我试图找到一个位串的奇偶校验,如果x有一个奇数#为0,它返回1.
我只能使用基本的按位运算,到目前为止,我已经通过了大部分测试,但我想知道两件事:
为什么x ^(x + ~1)有效?我偶然发现了这个问题,但如果有奇数个位,那么它似乎会给你1,如果是偶数则会给你一些东西.像7 ^ 6 = 1,因为7 = 0b0111
这是解决问题的正确方向吗?我假设我的问题源于第一次操作,特别是(x + ~1),因为它会溢出某些2的补码数.谢谢
码:
int bitParity(int x) {
int first = x ^ (x + ~1);
int second = first ^ 1; // if first XOR gave 1 you'll return 0 here
int result = !!second;
return result;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用pyplurk为Plurk编写一个简单的GUI前端.
我已经成功地创建了API连接,登录,并检索并显示了一个朋友列表.现在我正在尝试检索并显示Plurks列表.
pyplurk提供了一个GetNewPlurks函数,如下所示:
def GetNewPlurks(self, since):
'''Get new plurks since the specified time.
Args:
since: [datetime.datetime] the timestamp criterion.
Returns:
A PlurkPostList object or None.
'''
offset = jsonizer.conv_datetime(since)
status_code, result = self._CallAPI('/Polling/getPlurks', offset=offset)
return None if status_code != 200 else \
PlurkPostList(result['plurks'], result['plurk_users'].values())
Run Code Online (Sandbox Code Playgroud)
如您所见,这会返回一个PlurkPostList,后者又定义如下:
class PlurkPostList:
'''A list of plurks and the set of users that posted them.'''
def __init__(self, plurk_json_list, user_json_list=[]):
self._plurks = [PlurkPost(p) for p in plurk_json_list]
self._users = [PlurkUser(u) for u in user_json_list]
def __iter__(self):
return …Run Code Online (Sandbox Code Playgroud) 我通过静态分析工具提供了以下代码:
u1 = (u1 ^ u2); // OK
u1 = (u1 ^ u2) & u3; // NOT OK
u1 = (u1 ^ u2) & 10; // NOT OK
u1 = (u1 ^ u2) & 10U; // NOT OK
u1 = (unsigned char)(u1 ^ u2) & 10U; // OK
u1 = (unsigned char)(u1 ^ u2) & u3; // OK
Run Code Online (Sandbox Code Playgroud)
"OK"表示静态分析工具没有抱怨."不OK"指的是静态分析工具没有抱怨 - 声称按位操作的某些操作数不是一个无符号整数.
最后两行的结果表明括号正在引起
一个.要签名的实际类型转换
湾 静态分析工具认为是签名的类型转换
我将向静态分析工具开发人员询问(b).
但在此之前,我想知道C语言是否可以做(a)?