小编DaB*_*ler的帖子

比 % 运算符更快的可分性测试?

我注意到我的电脑上有一个奇怪的东西。*手写的可分性测试明显比%算子快。考虑最小的例子:

* AMD 锐龙 Threadripper 2990WX,GCC 9.2.0

static int divisible_ui_p(unsigned int m, unsigned int a)
{
    if (m <= a) {
        if (m == a) {
            return 1;
        }

        return 0;
    }

    m += a;

    m >>= __builtin_ctz(m);

    return divisible_ui_p(m, a);
}
Run Code Online (Sandbox Code Playgroud)

该示例受奇数a和 的限制m > 0。然而,它可以很容易地推广到所有am。代码只是将除法转换为一系列加法。

现在考虑使用以下命令编译的测试程序-std=c99 -march=native -O3

    for (unsigned int a = 1; a < 100000; a += 2) {
        for (unsigned int m …
Run Code Online (Sandbox Code Playgroud)

c math x86 modulo compiler-optimization

23
推荐指数
2
解决办法
749
查看次数

模运算符比手动实现慢?

我发现手动计算%运算符__int128比内置的编译器运算符要快得多。我将向您展示如何计算模 9,但该方法可用于计算模任何其他数字。

首先,考虑内置编译器操作符:

uint64_t mod9_v1(unsigned __int128 n)
{
    return n % 9;
}
Run Code Online (Sandbox Code Playgroud)

现在考虑我的手动实现:

uint64_t mod9_v2(unsigned __int128 n)
{
    uint64_t r = 0;

    r += (uint32_t)(n);
    r += (uint32_t)(n >> 32) * (uint64_t)4;
    r += (uint32_t)(n >> 64) * (uint64_t)7;
    r += (uint32_t)(n >> 96);

    return r % 9;
}
Run Code Online (Sandbox Code Playgroud)

测量超过 100,000,000 个随机数给出以下结果:

mod9_v1 | 3.986052 secs
mod9_v2 | 1.814339 secs
Run Code Online (Sandbox Code Playgroud)

GCC 9.3.0 with-march=native -O3用于 AMD Ryzen Threadripper 2990WX。 是godbolt的链接。

我想问一下它在你这边的行为是否相同?(在向 GCC Bugzilla …

c x86-64 compiler-optimization 128-bit modular-arithmetic

23
推荐指数
1
解决办法
4462
查看次数

如何将这个(100,100)numpy数组转换为pygame中的灰度精灵?

我正在尝试制作一种称为Gabor补丁的特殊光栅,其中的一个示例可以在本教程的底部找到,其代码我移植到python.

使用matplotlib的imshow函数,我获得了以下补丁.用matplotlib的imshow显示python生成的Gabor补丁

虽然着色不同,但我怀疑这与matplotlib如何显示数值有关.在本质上,这图像是2D,100逐100像素阵列从含有值-1.01.0(含).如果有人想尝试操纵有问题的数组,我在这里将它保存为pickle对象.

我的问题如下:如何在确保满足以下条件的同时将此数组传输到pygame表面?

  1. 着色转换为灰度着色(cf:第一个链接中的最后一个图像)
  2. 解决方案必须使用pygame版本1.9.1release.出于某种莫名其妙的原因,我找不到1.9.2在我的操作系统上安装的方法(Ubuntu 13.04).在PIP上似乎没有PPA和pygame显然没有.

非常感谢您提前,如果我能提供更多信息,请告诉我!

编辑

关于@ Veedrac的解决方案(与我自己非常相似),这是我在matplotlib中使用灰度色彩图时的补丁imshow.这就是我想要的:

from matplotlib.pyplot import *
import matplotlib.cm as cm

figure()
imshow(g, cm=cm.Greys_r)
show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

python pygame numpy

11
推荐指数
1
解决办法
2681
查看次数

使用const成员放置new和赋值

为什么这种未定义的行为?

struct s
{
    const int id; // <-- const member

    s(int id):
        id(id)
    {}

    s& operator =(const s& m) {
        return *new(this) s(m); // <-- undefined behavior?
    }
};
Run Code Online (Sandbox Code Playgroud)

(从标准引用会很好).

这个问题来自于这个答案.

c++ const placement-new assignment-operator language-lawyer

10
推荐指数
1
解决办法
592
查看次数

C,内联函数和GCC

如果我有:

inline int foo(void)
{
   return  10 + 3;
}

int main(void)
{
   foo();
}
Run Code Online (Sandbox Code Playgroud)

使用GCC,文件编译得很好,但链接器返回 undefined reference to foo

相反,如果我删除inline链接器很高兴!

看起来链接器可以看到外部定义的标识符,但内联定义的标识符不是.

此外,如果我使用-O3标志编译,链接器将看到内联定义的标识符.

有什么问题?

c

8
推荐指数
1
解决办法
1699
查看次数

如何在C中实现算术右移

在信号处理许多无损算法需要的形式⌊的表达的评估  一个  / 2 b  ⌋,其中一个,b是签名(一个可能为负,b非负)的整数和⌊·⌋是地板函数.这通常会导致以下实施.

int floor_div_pow2(int numerator, int log2_denominator)
{
    return numerator >> log2_denominator;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,C标准规定>>如果左操作数具有有符号类型和负值,则运算符的结果是实现定义的.

为了确保所有平台上的正确行为,可以用多个if-else条件替换这个简单的函数,从而导致程序性能不佳.(必须有人来治疗的整数溢出和考虑的情况下,当numeratorINT_MIN.)

因此,我想问一下,在C中实现算术右移的最佳实践是什么?理想情况下,我正在寻找与上面的代码片段编译成相同代码1的构造,同时避免实现定义的行为.

1考虑例如gcc和x86-64平台

更新:

经过一番思考,我意识到我在上面的问题中做了不正确的暗示.如果平台不使用二进制补码,则使用算术移位计算负数的基函数是没有意义的.我们的目标是实现表达⌊  一个  / 2 b  ⌋在便携式方式.

c bit-manipulation bit-shift integer-arithmetic signed-integer

6
推荐指数
1
解决办法
1827
查看次数

坐标转换Gauss-Kruger-WGS84使用GeoTools不正确

我在GeoTools的帮助下遇到了一个关于心爱坐标变换的问题:我想将Gauss-Kruger(第5区,EPSG 31469)的一组坐标转换成普通的WGS84坐标(EPSG 4326).

我用一个简单的例子构建了一个代码(只需要一对坐标):

double coordX = 5408301.53; 
double coordY = 5659230.5;
double[] punt = new double[2];

CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:31469");
CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326");

MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);

DirectPosition expPt = new GeneralDirectPosition(coordX, coordY);
expPt = transform.transform(expPt, null);
punt = expPt.getCoordinate();

System.out.println(punt[0] + ", " + punt[1]); //lon, lat
Run Code Online (Sandbox Code Playgroud)

调试后的结果如下:48.791886921764345,17.16525096311777

当我检查我获得的WGS84坐标(只是将它们打到谷歌地图)时,我最终在奥地利附近的捷克共和国的某个地方,虽然这对坐标应该在德国东部的某个地方(当然,我用一些html检查了它)解码器):

--->应该是结果:51.0609167,13.6900142.

我无法想象出现这种失败的原因.GeoTools获得了两个想要的CRS(我从java控制台中附加了响应的摘录)

有人能解释一下吗?我很感激任何帮助!

许多问候,塞巴斯蒂安


**sourceCRS:**
PROJCS["DHDN / 3-degree Gauss-Kruger zone 5",
    GEOGCS["DHDN", 
    DATUM["Deutsches Hauptdreiecksnetz", 
      SPHEROID["Bessel 1841", 6377397.155, 299.1528128, AUTHORITY["EPSG","7004"]], 
      TOWGS84[612.4, 77.0, 440.2, -0.054, 0.057, -2.797, 2.55], …
Run Code Online (Sandbox Code Playgroud)

java wgs84 geotools

5
推荐指数
1
解决办法
2696
查看次数

如何将C程序转换为类

所以我一直在研究这个项目,其目标是使用递归和邻接矩阵来找出一个人可以通过地铁系统可以采取多少条路线,而不必多次通过轨道.这对我来说是不言自明的,但现在我迷失在程序2上,这是从C++中的程序1和使用三个类和递归来做同样的问题.这些课程被认为是SubwaySystem,Station和Track.我真的不知道如何从简单的邻接矩阵过渡到三个类?这似乎适得其反,因为它似乎更复杂.我已经研究了一段时间了,我似乎无法利用所有三个班级.

我尝试过的方法:我的方法是创建1个地铁系统,有12个站点,每个站点都有一个轨道阵列.例如,站A有一个可以到达的站B.在站A中有一个由12个轨道组成的阵列,但只有1个轨道被激活.但是我继续运行错误,因为我尝试初始化Track类中的数组,然后在SubwaySystem类中使用它们.然后尝试使用递归来获取所有可能的路由使得它变得更加困难.我真的不知道如何解决这个问题.

我的代码中的邻接矩阵几乎映射了从站到站的整个连接.该站是对应于每行/列的A-L.我不知道如何在使用邻接矩阵的情况下用c ++ 表示.

我在C中的代码(程序1):

#include <stdio.h>

void routesFinder(int row, int col);

char station[13] = "ABCDEFGHIJKL";
char order[25] = "A";
int subway[12][12] = {{0,1,0,0,0,0,0,0,0,0,0,0},
                 {1,0,1,1,1,1,0,0,0,0,0,0},
                 {0,1,0,0,1,0,0,0,0,0,0,0},
                 {0,1,0,0,1,0,0,0,0,0,0,0},
                 {0,1,1,1,0,0,1,1,0,0,0,0},
                 {0,1,0,0,0,0,0,1,0,0,0,0},
                 {0,0,0,0,1,0,0,0,0,0,1,0},
                 {0,0,0,0,1,1,0,0,1,1,1,0},
                 {0,0,0,0,0,0,0,1,0,0,1,0},
                 {0,0,0,0,0,0,0,1,0,0,1,0},
                 {0,0,0,0,0,0,1,1,1,1,0,1},
                 {0,0,0,0,0,0,0,0,0,0,1,0}};

int paths = 0, i = 1;

int main(){
     routesFinder(0, 0); //start with first station row, first column
     printf("\n%d days before repeating a route.\n", paths);
     return 0;
}

void routesFinder(int row, int col) {
     while (col < 12) { //go …
Run Code Online (Sandbox Code Playgroud)

c c++ arrays recursion class

5
推荐指数
1
解决办法
412
查看次数

Python OpenCV如何在转换图像后保存图像

我是Python新手。我正在使用 opencv 来转换图像。
以下是脚本中的最后两行:

warped = warped.astype("uint8") * 255
cv2.imshow("Scanned", imutils.resize(warped, height = 650))
Run Code Online (Sandbox Code Playgroud)

我想将变形图像保存为 jpeg 文件。
我该怎么办?

python opencv python-2.7

5
推荐指数
1
解决办法
1万
查看次数

为什么`(a--> 0)`和`((a--)> 0)`是一样的?

该计划是

main()
{
int a=1;
if( a-- > 0)
   printf("AAAA");
else
   printf("BBBB");
}
Run Code Online (Sandbox Code Playgroud)

它的输出是AAAA ,如果我使用

main()
{
int a=1;
if( (a--) > 0)
   printf("AAAA");
else
   printf("BBBB");
}
Run Code Online (Sandbox Code Playgroud)

然后为什么输出是AAAA. ()那时候有更多的偏好--.

c c++ operators

4
推荐指数
1
解决办法
210
查看次数