标签: bits

位操作(C++)

最近我对访谈提出了一个问题 - 我被要求比较性能方面的按位操作.

比如,简要描述不同位操作的性能.

我想这个问题可能非常普遍且非常适合机器,但我也认为应该有一些关于此的一般规则,你必须提到(我没有:).

那么 - 你会回答什么?

我可能还应该说,在C (或C++,无论如何)中比较它们的性能可能是个好主意,因为我认为这些语言为编译器提供了更多空间来执行与位相关的优化.

谢谢.


好的,完整的问题背景.

采访有几个部分,其中一些真的是小菜一碟,有些是噩梦.与位相关的部分很难,包括以下问题:

  • 浮点数规格float,double

  • 快速float- > int转换(如果你知道范围,甚至更快)

那些并不是很难,但作为这个与位相关的部分中的最后一个问题,我被要求列举我所知道的位操作并比较它们的性能.

我回答了一些不太像描述性的东西,比如"它的架构,编译器,......具体,它实际上并不重要,按位已经非常低级",但我猜这个答案很糟糕.

c++ performance bits

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

将字符串表示形式转换为字节

我刚刚开始学习文件压缩,我遇到了一些障碍.我有一个应用程序将编码一个字符串,如"程序"作为压缩二进制表示"010100111111011000"(注意这仍然存储为一个字符串).

Encoding
g       111
r       10
a       110
p       010
o       011
m       00
Run Code Online (Sandbox Code Playgroud)

现在我需要使用a将此写入文件系统FileOutputStream,我遇到的问题是,如何将字符串"010100111111011000"转换为要写入文件系统的byte[]/ bytes FileOutputStream

我之前从未使用过bit/bytes,所以我在这里处于死路.

java byte bits bit-manipulation huffman-code

9
推荐指数
1
解决办法
5763
查看次数

如何在计算机中表示分数?

由于计算机以"1"和"0"的形式思考,它们如何计算和表示7.50等分数?我知道Java和JavaScript,如果答案需要,你可以用它们作为例子.

编辑:我正在观看这部麻省理工学院视频,由科尔曼教授在46:31秒进行散列,他使用模块化轮子解释了乘法散列函数,模块化轮子是一个单位圆,其中有几个点,这些点表示分数.这促使我在这里问这个基本问题.

java language-agnostic floating-point bits fractions

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

非恢复除法算法

有没有人知道使用非恢复除法划分无符号二进制整数的步骤?

很难在网上找到任何好的消息来源.

即如果A = 101110B = 010111

我们如何A divided by B在非恢复部门找到?寄存器在每一步中都是什么样的?

谢谢!

algorithm binary bits division addition

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

java位操作>>>移位

为什么如果

int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31; 
Run Code Online (Sandbox Code Playgroud)

我们有00000000000000000000000000000001

但如果

int x = -1
x = x >>> 32;
Run Code Online (Sandbox Code Playgroud)

我们有11111111111111111111111111111111(再次-1)

但不是00000000000000000000000000000000?

java int bits operation

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

如何在java中将0x80000000等同于-2147483648?

0x80000000拿二进制我们得到

1000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

这等同于什么-2147483648?我用这个程序得到了这个问题.

class a
{
        public static void main(String[] args)
        {
                int a = 0x80000000;
                System.out.printf("%x %d\n",a,a);
        }
}

meow@VikkyHacks:~/Arena/java$ java a
80000000 -2147483648
Run Code Online (Sandbox Code Playgroud)

编辑我了解到2的补码用于表示负数.当我试图把它与1的补码相等时

1's Comp. :: 0111 1111 1111 1111 1111 1111 1111 1111
2's Comp. :: 1000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

这也没有任何意义,0x80000000等同于什么-2147483648

java bits

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

二进制乘法:乘积多少位

如果你将两个二进制数相乘,一个有 n 位,一个有 m 位,乘积是多少位?例如,如果我将一个 6 位的二进制数和一个 8 位的二进制数相乘,乘积是多少位?

binary bits multiplication

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

我的Bitset的大小是多少?

我希望以System.currentTimeInMillis最小的空间存储在内存中.因为我必须将数百万存储在内存中.

我转换它给binaryString了我41 bits

这是我的计划

public class BitSetSize {
    public static void main(final String[] args) {
        final long currentTimeMillis = System.currentTimeMillis();
        final String currentTimeToBinaryString = Long.toBinaryString(currentTimeMillis);
        System.out.println("Size in bits: " + currentTimeToBinaryString.length());

        final BitSet bitSet = BitSet.valueOf(new long[]{currentTimeMillis});
        System.out.println("Bitset length: " + bitSet.length());
        System.out.println("Bitset size: " + bitSet.size());

        System.out.println("Size of biset object(bytes): " + MemoryMeasurer.measureBytes(bitSet));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我得到了

Size in bits: 41
Bitset length: 41
Bitset size: 64
Size of biset object(bytes): 48
Run Code Online (Sandbox Code Playgroud)


-为什么bitSet.length() …

java memory bits memory-management data-structures

8
推荐指数
2
解决办法
5380
查看次数

打印长整数位(C++)

我想打印一个很长的数字的所有位.当我在main()中执行它时一切都很好,但在printBits()函数(代码相同)中,第32位有额外的1.

代码:

#include <iostream>

void printBits(long long number)
{
    std::cout<<number<<" -> ";
    for (char i=63; i>=0; --i)
    {
        std::cout<<(bool)(number&(1<<i));
    }
    std::cout<<std::endl;
}

int main()
{
    long long number=1;

    std::cout<<number<<" -> ";
    for (char i=63; i>=0; --i)
    {
        std::cout<<(bool)(number&(1<<i));
    }
    std::cout<<std::endl;

    printBits(number);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

1 -> 0000000000000000000000000000000000000000000000000000000000000001
1 -> 0000000000000000000000000000000100000000000000000000000000000001

Process returned 0 (0x0)   execution time : 0.012 s
Press any key to continue.
Run Code Online (Sandbox Code Playgroud)

c++ bits long-long

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

解析Yann LeCun的MNIST IDX文件格式

我想了解如何打开这个版本的MNIST数据集.例如,训练集标签文件train-labels-idx1-ubyte定义为:

TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  60000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label
Run Code Online (Sandbox Code Playgroud)

我发现一些似乎有效的在线代码,但不明白它是如何工作的:

with open('train-labels-idx1-ubyte', 'rb') as f:
    bytes = f.read(8)
    magic, size = struct.unpack(">II", bytes)

print(magic) # 2049
print(size)  # 60000
Run Code Online (Sandbox Code Playgroud)

我的理解是struct.unpack将第二个参数解释为两个4字节整数的大端字节字符串(参见此处).bytes但是,当我实际打印出值时,我得到:

b'\x00\x00\x08\x01\x00\x00\xea`'
Run Code Online (Sandbox Code Playgroud)

第一个四字节整数是有意义的:

b'\x00\x00\x08\x01'
Run Code Online (Sandbox Code Playgroud)

前两个字节为0.下一个表示数据是无符号字节.并且0x01表示标签的一维矢量.假设到目前为止我的理解是正确的,接下来的三个(四个?)字节会发生什么: …

python binary bits mnist

7
推荐指数
2
解决办法
4864
查看次数