最近我对访谈提出了一个问题 - 我被要求比较性能方面的按位操作.
比如,简要描述不同位操作的性能.
我想这个问题可能非常普遍且非常适合机器,但我也认为应该有一些关于此的一般规则,你必须提到(我没有:).
那么 - 你会回答什么?
我可能还应该说,在C (或C++,无论如何)中比较它们的性能可能是个好主意,因为我认为这些语言为编译器提供了更多空间来执行与位相关的优化.
谢谢.
好的,完整的问题背景.
采访有几个部分,其中一些真的是小菜一碟,有些是噩梦.与位相关的部分很难,包括以下问题:
浮点数规格float,double
快速float- > int转换(如果你知道范围,甚至更快)
那些并不是很难,但作为这个与位相关的部分中的最后一个问题,我被要求列举我所知道的位操作并比较它们的性能.
我回答了一些不太像描述性的东西,比如"它的架构,编译器,......具体,它实际上并不重要,按位已经非常低级",但我猜这个答案很糟糕.
我刚刚开始学习文件压缩,我遇到了一些障碍.我有一个应用程序将编码一个字符串,如"程序"作为压缩二进制表示"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,所以我在这里处于死路.
由于计算机以"1"和"0"的形式思考,它们如何计算和表示7.50等分数?我知道Java和JavaScript,如果答案需要,你可以用它们作为例子.
编辑:我正在观看这部麻省理工学院视频,由科尔曼教授在46:31秒进行散列,他使用模块化轮子解释了乘法散列函数,模块化轮子是一个单位圆,其中有几个点,这些点表示分数.这促使我在这里问这个基本问题.
有没有人知道使用非恢复除法划分无符号二进制整数的步骤?
很难在网上找到任何好的消息来源.
即如果A = 101110和B = 010111
我们如何A divided by B在非恢复部门找到?寄存器在每一步中都是什么样的?
谢谢!
为什么如果
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?
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
如果你将两个二进制数相乘,一个有 n 位,一个有 m 位,乘积是多少位?例如,如果我将一个 6 位的二进制数和一个 8 位的二进制数相乘,乘积是多少位?
我希望以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() …
我想打印一个很长的数字的所有位.当我在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) 我想了解如何打开这个版本的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表示标签的一维矢量.假设到目前为止我的理解是正确的,接下来的三个(四个?)字节会发生什么: …