小编Nub*_*bok的帖子

为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

x86-64 Tour of Intel Manuals中,我读到了

也许最令人惊讶的事实是,诸如MOV EAX, EBX自动将指令的高32位归零的指令RAX.

同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们:

  • 64位操作数在目标通用寄存器中生成64位结果.
  • 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果.
  • 8位和16位操作数生成8位或16位结果.目标通用寄存器的高56位或48位(分别)不会被操作修改.如果8位或16位操作的结果用于64位地址计算,则将寄存器显式符号扩展为完整的64位.

在x86-32和x86-64汇编中,16位指令如

mov ax, bx
Run Code Online (Sandbox Code Playgroud)

不要表现出这种"奇怪"的行为,即eax的上层词被归零.

因此:引入这种行为的原因是什么?乍一看似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖).

x86 assembly x86-64 cpu-registers zero-extension

97
推荐指数
3
解决办法
2万
查看次数

WinAPI:创建不带标题栏的可调整大小的窗口,但使用最小化/最大化/关闭按钮(如Firefox/Chrome/Opera)

如果你看一下Firefox,Chrome或Opera浏览器的窗口,你会发现它们的窗口

  • 有最小化/最大化/关闭按钮
  • 可调整大小
  • 但没有标题栏

我很感兴趣:我怎么能创建这样一个窗口?

我已经尝试过的:

我在StackOverflow上看了一下(也用google搜索过),发现这个:用win32打开一个没有标题栏的窗口

不幸的是,这并没有完全帮助:

第一步是扩展建议的解决方案,打开一个没有win32标题栏的窗口

hWnd = CreateWindow(szWindowClass, szTitle, WS_BORDER, 
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
  NULL, NULL, hInstance, NULL);

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX);
// See remarks on http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545.aspx
SetWindowPos(hWnd, 0, 
   0, 0, 0, 0, // Position + Size
   SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
Run Code Online (Sandbox Code Playgroud)

当然,这没有提供最小化/最大化按钮,但另一方面,如果我想要最小化/最大化按钮,我必须这样做:

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | 
    WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION);
Run Code Online (Sandbox Code Playgroud)

为什么这种组合似乎是必要的?首先我可能想要,WS_MAXIMIZEBOX | WS_MINIMIZEBOX因为我想要这些按钮.

但是http://msdn.microsoft.com/en-us/library/ms632600.aspx说,假如我的一个WS_MAXIMIZEBOXWS_MINIMIZEBOX,我也有设置WS_SYSMENU.当我设置时WS_SYSMENU,我也必须设置WS_CAPTION但这不是我想要的,因为我想避开标题栏(实际上:如果WS_CAPTION …

c++ winapi window titlebar

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

使用很少使用的功能的GIF测试套件包含图像

GIF图形格式的规格(复数,因为有版本87a和89a)很容易在互联网上找到(对于那些不想谷歌的人:

正如您在规范中看到的那样,GIF支持我从未见过的一些功能; 我只想举两个例子(为简单起见,GIF 89a): - 明文扩展:在http://www.vias.org/pngguide/chapter11_15.html上有一些更详细的文档 - 像素宽高比:见部分18.逻辑屏幕描述符.GIF 89a规格

另一方面,对于PNG,似乎有很多可用的测试图像:http://www.libpng.org/pub/png/pngmisc.html(向下滚动); 最常见的是官方的PNG测试套件http://www.schaik.com/pngsuite/,也可以在http://www.libpng.org/pub/png/pngsuite.html上反映出来.

我正在寻找的是一个GIF图像测试套件,它还特别包含使用很少使用或经常以错误方式实现的功能的图像.

我能在互联网上找到的最好结果如下:

因此,我发现没有任何内容满足上述GIF图像测试套件的标准,特别是包含很少使用或经常以错误方式实现的功能.

所以:你知道这样的测试套件吗?

file-format image gif test-suite

12
推荐指数
1
解决办法
3272
查看次数

Visual Studio 2010(C++):暂时禁止C4706警告

在Visual Studio 2010中编译以下C++源文件时启用了警告级别/ W4

#include <cstdio>  // for printf
#include <cstring> // for strcmp

char str0[] = "Hello";
char str1[] = "World";

int main()
{
    int result;

    if (result = strcmp(str0, str1)) // line 11
    {
        printf("Strings are different\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

你得到以下警告

警告C4706:条件表达式中的赋值

对于第11行.

我想在这个地方准确地压制这个警告.所以我尝试了Google并找到了这个页面:http://msdn.microsoft.com/en-us/library/2c8f766e(v = VS.100).aspx

所以我将代码更改为以下内容 - 希望这可以解决问题:

#include <cstdio>  // for printf
#include <cstring> // for strcmp

char str0[] = "Hello";
char str1[] = "World";

int main()
{
    int result;

#pragma warning(push)
#pragma warning(disable …
Run Code Online (Sandbox Code Playgroud)

visual-studio-2010 compiler-warnings suppress-warnings visual-studio visual-c++

12
推荐指数
4
解决办法
9688
查看次数

Open Watcom的优点和缺点

因为在StackOverflow的一些帖子中,如果可行的话,建议尝试支持多个(在这种情况下是C/C++)编译器,因为这会强制您编写更符合标准的代码并帮助查找错误.

所以我一直在寻找额外的免费C/C++编译器,我可以为我的项目添加支持(它是用C/C++编写的(两种语言相结合)).我发现Open Watcom是一个有趣的候选人.

所以我的问题是:Open Watcom C/C++编译器与其他编译器相比有哪些优点和缺点(例如gcc/g ++,Visual C++等)?

c c++ compiler-construction watcom

9
推荐指数
3
解决办法
8541
查看次数

匹配算法

我正在编写一个应用程序,它将一组用户分成两组,以便一起执行任务.每个用户可以指定关于其伙伴的各种偏好,例如

  • 性别
  • 语言
  • 年龄
  • 位置(通常在用户居住的X英里/公里范围内)

理想情况下,我希望用户能够指定这些首选项中的每一个是"很高兴"还是"必须拥有",例如"我更愿意与英语母语人士匹配,但我不能是与女性相匹配".

我的目标是最大化比赛的整体平均质量.例如,假设系统中有4个用户,A,B,C,D.这些用户可以通过3种方式进行匹配:

Option 1     Match Score
A-B           5
C-D           4
---
Average       4.5

Option 2     Match Score
A-C           2
B-D           3
---
Average       2.5

Option 3     Match Score
A-D           1
B-C           9
---
Average       5

所以在这个人为的例子中,选择第3个选项是因为它具有最高的整体匹配质量,即使A和D根本不匹配.

有没有一种算法可以帮助我:

  • 计算上面显示的"匹配分数"
  • 选择最大化平均匹配分数的配对(同时尊重每个用户的绝对约束)

并不是绝对必须匹配每个用户,因此在显着降低匹配的整体质量和留下几个没有匹配的用户之间做出选择,我会选择后者.

显然,我希望计算匹配的算法尽快完成,因为系统中的用户数量可能非常大.

最后,这个计算匹配分数和最大化整体平均值的系统只是我自己提出的一个heurisitic.如果有更好的方法来计算配对,请告诉我.

更新

我所描述的问题似乎与稳定的婚姻问题类似,有一个众所周知的解决方案.但是,在这个问题中,我不要求所选择的对是稳定的.我的目标是选择对,以便最大化平均"匹配分数"

algorithm computer-science graph matching

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

如何比较两个数组的元素

我想比较两个数组的元素,并检查它们是否相等.我已经尝试了各种解决方案但没有真正有效.

我试过如何比较两个对象数组的解决方案

这是我的目标:

struct AccountBalance: Decodable {
    let balance: Double
    let currency: String

    init(balance: Double, currency: String ) {
        self.currency = currency
        self.balance = balance
    }

    enum CodingKeys: String, CodingKey {
        case currency = "Currency"
        case balance = "Balance"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我试过的链接中的代码:

let result = zip(accountBalance, getsSaved).enumerate().filter() {
                $1.0 == $1.1
                }.map{$0.0}
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Closure tuple parameter '(offset: Int, element: (AccountBalance, AccountBalance))' does not support destructuring with implicit parameters
Run Code Online (Sandbox Code Playgroud)

arrays swift

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

C++:仅使用无符号类型时有符号/无符号不匹配

当我尝试使用启用了警告级别/ W4的Visual Studio 2010 C++编译器(X86)编译以下C++程序时,我在标记的行处收到签名/未签名的不匹配警告.

#include <cstdio>
#include <cstdint>
#include <cstddef>

int main(int argc, char **argv)
{
    size_t idx = 42;
    uint8_t bytesCount = 20;

    // warning C4389: '==' : signed/unsigned mismatch
    if (bytesCount + 1 == idx)
    {
        printf("Hello World\n");
    }

    // no warning
    if (bytesCount == idx)
    {
        printf("Hello World\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我很困惑,因为我只使用无符号类型.自从比较

bytesCount == idx
Run Code Online (Sandbox Code Playgroud)

没有引起这样的警告,这可能与这里发生的一些奇怪的隐性对话有关.

因此:我得到这个警告的原因是什么,以及这种对话发生的规则(如果这是原因)?

c++ unsigned signed unsigned-integer

5
推荐指数
2
解决办法
1878
查看次数

Java:sort从索引到索引的列表

对于数组,有一个特殊的函数用于将数组的一部分从索引排序到索引:

Arrays.sort(Object[] a, int fromIndex, int toIndex)

对于 List< T>

还有一个排序功能

Collections.sort(List<T> list)

不幸的是,没有变体接受fromIndex和toIndex参数.

我知道我可以通过应用来解决这个问题

  • 将List转换为数组并应用Arrays.sort,然后将其转换回List
  • 将fromIndex索引的列表条目复制到toIndex到新列表(通过使用list.subList(fromIndex, toIndex)),对其进行排序并覆盖旧列表条目

但我希望有一个更漂亮的方法来做到这一点.

java arrays sorting list

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

有关Linux/POSIX中特定于平台的宏的文档

在Windows下使用Visual Studio(或尝试兼容的编译器)编译C/C++程序时,有一个预定义的宏_WIN32(来源:http://msdn.microsoft.com/en-us/library/b0084kay.aspx)您可以使用特定于平台的#ifdef-s.

我正在寻找的是一个Linux下的模拟器:一个宏告诉我,我正在为Linux /一个声称与(或多或少)POSIX兼容的操作系统进行编译.

所以我查看了gcc文档,发现了这个:http://gcc.gnu.org/onlinedocs/cpp/System_002dspecific-Predefined-Macros.html

应用于我的程序,以下宏(gcc 4.4.5 - Ubuntu 10.10)看起来很有前途(我希望我没有删除一个重要的宏):

#define __USE_BSD 1
#define __unix__ 1
#define __linux 1
#define __unix 1
#define __linux__ 1
#define _POSIX_SOURCE 1
#define __STDC_HOSTED__ 1
#define __STDC_IEC_559__ 1
#define __gnu_linux__ 1
#define __USE_SVID 1
#define __USE_XOPEN2K 1
#define __USE_POSIX199506 1
#define _G_USING_THUNKS 1
#define __USE_XOPEN2K8 1
#define _BSD_SOURCE 1
#define unix 1
#define linux 1
#define __USE_POSIX 1
#define __USE_POSIX199309 1
#define __SSP__ 1
#define _SVID_SOURCE 1 …
Run Code Online (Sandbox Code Playgroud)

c c++ linux macros posix

4
推荐指数
2
解决办法
3665
查看次数