相关疑难解决方法(0)

如何计算32位整数中的设置位数?

代表数字7的8位看起来像这样:

00000111
Run Code Online (Sandbox Code Playgroud)

设置三位.

什么算法来确定32位整数中的设置位数?

algorithm binary bit-manipulation hammingweight iec10967

838
推荐指数
31
解决办法
52万
查看次数

轮班操作员如何在Java中工作?

我试图了解班次运营商,并没有得到太多.当我尝试执行以下代码时

System.out.println(Integer.toBinaryString(2 << 11));
System.out.println(Integer.toBinaryString(2 << 22));
System.out.println(Integer.toBinaryString(2 << 33));
System.out.println(Integer.toBinaryString(2 << 44));
System.out.println(Integer.toBinaryString(2 << 55));
Run Code Online (Sandbox Code Playgroud)

我得到以下内容

1000000000000    
100000000000000000000000    
100    
10000000000000    
1000000000000000000000000    
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

java bit-shift

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

哪个更快:x << 1或x << 10?

我不想优化任何东西,我发誓,我只想出于好奇而问这个问题.我知道,在大多数硬件有位移(例如的组件的命令shl,shr),它是一个命令.但是,你转移了多少比特(纳秒级,或CPU技巧)是否重要?换句话说,在任何CPU上是否更快?

x << 1;
Run Code Online (Sandbox Code Playgroud)

x << 10;
Run Code Online (Sandbox Code Playgroud)

请不要因为这个问题而恨我.:)

c c++ cpu performance low-level

82
推荐指数
8
解决办法
7018
查看次数

如何通过cout将字符输出为整数?

#include <iostream>

using namespace std;

int main()
{  
    char          c1 = 0xab;
    signed char   c2 = 0xcd;
    unsigned char c3 = 0xef;

    cout << hex;
    cout << c1 << endl;
    cout << c2 << endl;
    cout << c3 << endl;
}
Run Code Online (Sandbox Code Playgroud)

我预计输出如下:

ab
cd
ef
Run Code Online (Sandbox Code Playgroud)

然而,我一无所获.

我想这是因为cout总是将'char','signed char'和'unsigned char'视为字符而不是8位整数.但是,'char','signed char'和'unsigned char'都是完整的类型.

所以我的问题是:如何通过cout将字符输出为整数?

PS:static_cast(...)很难看,需要更多的工作来修剪额外的比特.

c++ io iostream outputstream type-conversion

52
推荐指数
3
解决办法
6万
查看次数

clang 如何生成平方和的非循环代码?

我承认这个问题的答案可能是“一些非常具体的魔法”,但我对在这里观察到的情况感到有点震惊。我想知道是否有人了解这些类型的优化是如何工作的。我发现编译器的设计非常有趣,我真的无法想象它是如何工作的。我确信答案就在 clang 源代码中的某个地方,但我什至不知道该在哪里查找。

我是大学课程的助教,最近有人要求我帮助解决一个简单的家庭作业问题。这让我走上了一条有趣的道路......

问题很简单:在 x86_64 汇编中,编写一个给定(正)整数 n 返回的函数1^2 + 2^2 + 3^2 + ... + n^2

我决定尝试一下,在帮助他们在 x86_64 汇编中编写此代码后,我(拥有一台 M1 macbook)决定看看是否可以在 arm64 汇编中创建一个不错的解决方案。我想出了一个相对简单直接的解决方案:

_sum_squares:
    mov x1, x0  ; Do multiplication from x1
    mov x0, xzr ; Clear x0

    Lloop:
        ; x0 <-- (x1 * x1) + x0
        madd x0, x1, x1, x0

        ; Loop until x1 == 0
        subs x1, x1, #1
        bne Lloop

    ret
Run Code Online (Sandbox Code Playgroud)

(我希望有某种很好的方法可以--x1 == 0在一条指令中进行分支,但我想不出任何方法)

注意:任何基础数论课程中都有一个简单的公式,即[n(n + 1)(2n + 1)] / …

optimization assembly llvm clang arm64

45
推荐指数
2
解决办法
3298
查看次数

C#按位向左旋转并向右旋转

什么是的C#当量(.NET 2.0)_rotl_rotr从C++?

c# bitwise-operators

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

快速可分性测试(2,3,4,5,...,16)?

什么是最快的可分性测试?比如说,给定一个小端架构和一个32位有符号整数:如何计算得非常快,一个数字可被2,3,4,5整除,......最多16?

警告:给定的代码仅为示例.每一行都是独立的!使用模运算的明显解决方案在许多处理器上都很慢,这些处理器没有DIV硬件(像许多ARM一样).有些编译器也无法进行这样的优化(例如,如果divisor是函数的参数或依赖于某些东西).

Divisible_by_1 = do();
Divisible_by_2 = if (!(number & 1)) do();
Divisible_by_3 = ?
Divisible_by_4 = ?
Divisible_by_5 = ?
Divisible_by_6 = ?
Divisible_by_7 = ?
Divisible_by_8 = ?
Divisible_by_9 = ?
Divisible_by_10 = ?
Divisible_by_11 = ?
Divisible_by_12 = ?
Divisible_by_13 = ?
Divisible_by_14 = ?
Divisible_by_15 = ?
Divisible_by_16 = if(!number & 0x0000000F) do();
Run Code Online (Sandbox Code Playgroud)

和特殊情况:

Divisible_by_2k = if(number & (tk-1)) do();  //tk=2**k=(2*2*2*...) k times
Run Code Online (Sandbox Code Playgroud)

c c++ math assembly bit-manipulation

34
推荐指数
9
解决办法
2万
查看次数

'asm','__ asm'和'__asm__'有什么区别?

据我所知道的,唯一的区别__asm { ... };,并__asm__("...");是第一个使用mov eax, var第二个使用movl %0, %%eax:"=r" (var)结尾.还有什么其他差异?那又怎么样asm

c assembly gcc inline-assembly visual-c++

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

在某个位置或更低位置计算设置位的有效方法是什么?

给定std::bitset<64> bits任意数量的位和位位置X(0-63)

在X位或更低位计数位的最有效方法是什么,如果未设置X位,则返回0

注意:如果设置该位,则返回始终至少为1

蛮力方式很慢:

int countupto(std::bitset<64> bits, int X)
{
  if (!bits[X]) return 0;
  int total=1;
  for (int i=0; i < X; ++i)
  {
    total+=bits[i];
  }
  return total;
}
Run Code Online (Sandbox Code Playgroud)

这个count()方法bitset将为您popcount提供所有位,但bitset不支持范围

注意:这不是如何计算32位整数中的设置位数?因为它询问所有位而不是0到X的范围

c++ algorithm performance bit-manipulation

33
推荐指数
4
解决办法
5006
查看次数

旋转指令的目的是什么(ROL,x86上的RCL)?

我总是想知道一些CPU具有旋转指令的目的是什么(例如,ROL,x86上的RCL).什么样的软件使用这些说明?我首先想到它们可能用于加密/计算哈希码,但这些库通常用C编写,它没有映射到这些指令的运算符.
有没有人找到他们的用途?为什么他们在指令集中添加了哪些内容?

x86 assembly cpu-architecture machine-instruction

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