我需要测试位值为 1 的位置(对于 32 位整数从 0 到 31)是否形成连续区域。例如:
00111111000000000000000000000000 is contiguous
00111111000000000000000011000000 is not contiguous
Run Code Online (Sandbox Code Playgroud)
我希望这个测试,即一些功能has_contiguous_one_bits(int),是可移植的。
一个明显的方法是遍历位置以找到第一个设置位,然后是第一个未设置位并检查是否有更多设置位。
我想知道是否存在更快的方法?如果有找到最高和最低设置位的快速方法(但从这个问题看来没有任何可移植的),那么可能的实现是
bool has_contiguous_one_bits(int val)
{
auto h = highest_set_bit(val);
auto l = lowest_set_bit(val);
return val == (((1 << (h-l+1))-1)<<l);
}
Run Code Online (Sandbox Code Playgroud)
只是为了好玩,这里是前 100 个具有连续位的整数:
0 1 2 3 4 6 7 8 12 14 15 16 24 28 30 31 32 48 56 60 62 63 64 96 112 120 124 126 127 128 192 224 240 248 252 254 …Run Code Online (Sandbox Code Playgroud) 我从得知这个最近的答案是gcc和clang包括源文件名某处二进制作为元数据,调试未启用时也是如此.
我真的不明白为什么这应该是一个好主意.除了微小的隐私风险之外,当优化结果二进制(-Os)的大小时,这也会发生,这看起来效率低下.
为什么编译器包含这些信息?
gcc compilation clang compiler-optimization compiler-options
通常认为将一些包含作者,版本和许可证信息的行添加到源文件的顶部是一种好习惯.例如,Gnu GPL v3建议添加
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms [SNIP]
Run Code Online (Sandbox Code Playgroud)
我觉得将它手动添加到每个文件并且不得不一直更新所有这些信息(新作者,版权年份,版本颠簸)时都很繁琐.
有没有办法自动管理这个,所以我只需要在一个地方编辑这些东西,它就会被自动复制?
如果需要,您可以假设我正在使用任何现代版本控制系统.
我global在一个if命令中使用(在Matlab中)一个语句,所以我只有在真正需要时才将全局变量导入本地命名空间.
代码分析器警告我" global除非它是函数中的顶级语句,否则效率可能非常低".考虑到可能的内部实现,我发现这个限制非常奇怪和不寻常.我在考虑两种可能性:
这个警告的真正含义是" global它本身效率很低,所以不要在循环中使用它".特别是,在if中使用它,就像我正在做的那样,非常安全,而且警告发出错误(措辞不当)
警告是正确的; Matlab在后台使用了一些非常不寻常的变量加载机制,因此在if语句中导入全局变量要慢得多.在这种情况下,我想要提示或指示这些东西是如何工作的,因为我感兴趣,如果我想在将来编写有效的代码,这似乎很重要.
这两种解释中哪一项是正确的?(或者两者都不是?)
提前致谢.
编辑:更清楚:我知道这global很慢(显然我不能避免使用它,因为它是我正在使用的旧库的设计决定); 我问的是为什么Matlab代码分析器会抱怨
if(foo==bar)
GLOBAL baz
baz=1;
else
do_other_stuff;
end
Run Code Online (Sandbox Code Playgroud)
但不是
GLOBAL baz
if(foo==bar)
baz=1;
else
do_other_stuff;
end
Run Code Online (Sandbox Code Playgroud)
我发现很难想象第一个应该比第二个慢的原因.
似乎在git difftool执行外部命令时,它不会正确引用参数.
如果.gitconfig包含以下行:
[difftool.echo]
cmd = echo "$LOCAL" "$REMOTE"
Run Code Online (Sandbox Code Playgroud)
当我尝试difftool使用包含空格的路径运行时,例如
> git difftool -t echo HEAD^ HEAD spaces\ here/test.txt
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
/tmp/RL2Nyi_test.txt spaces here/test.txt
Run Code Online (Sandbox Code Playgroud)
如您所见,文件名未被引用(尽管命令中有明确的引号),因此参数解析失败.删除引号.gitconfig(编辑:以及将它们转义为\")不会改变结果.
(通过替换echo任何diff程序,您将获得更有意义的用例).
如何获得正确转义的文件名?
我正在使用包含许多tt标签的机器生成的HTML文件.我尝试了几种方式来设计它们,但到目前为止还没有任何方法对我有效:例如,
<html>
<head>
<style type="text/css">
.a {color:red;}
</style>
</head>
<body>
<p><tt class="a">this should be red</tt></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
不呈现为红色(至少在FF 6.0.1/Ubuntu中).
我做错了什么,或者tt不支持样式标签?
c ×1
c++ ×1
clang ×1
compilation ×1
css ×1
gcc ×1
git ×1
html ×1
licensing ×1
matlab ×1
path ×1
performance ×1
whitespace ×1