这是NVIDIA代表在招聘会上提出的一个问题:
编写小而有效的代码来交换一个字节内的每对位; 例如,10 11 01 10应该成为01 11 10 01.
有没有比for通过每个其他索引循环更"有效"的方法呢?我的代码很小,但我想不出这可能比循环更有效"...我猜测可能有办法使用XOR来避免循环,但我不能想办法.
谢谢!
有一个Java方法Double.doubleToLongBits基本上得到一个double并返回一个long相同的位.
我怎么能在C#中做到这一点?
谢谢
8位称为"字节".如何调用16位?"短"?"字"?
32位怎么样?我知道"int"依赖于CPU,我对普遍适用的名称感兴趣.
我想了解如何打开这个版本的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表示标签的一维矢量.假设到目前为止我的理解是正确的,接下来的三个(四个?)字节会发生什么: …
我已经看到了关于计算insert type of输入中设置位数的众多问题,但为什么它有用呢?
对于那些寻找有关位计数的算法的人,请看这里:
language-agnostic computer-science bits bit-manipulation bitcount
我有字节到二进制字符串函数,
std::string byte_to_binary(unsigned char byte)
{
int x = 128;
std::ostringstream oss;
oss << ((byte & 255) != 0);
for (int i = 0; i < 7; i++, x/=2)
oss << ((byte & x) != 0);
return oss.str();
}
Run Code Online (Sandbox Code Playgroud)
如何以相同的方式将int写入位?我不想在二进制字符串的开头加上额外的0,这就是为什么我无法弄清楚每次如何创建一个可变长度.另外,我没有使用std :: bitset.
这是Long中反向的实现:
public static long reverse(long i) {
// HD, Figure 7-1
i = (i & 0x5555555555555555L) << 1 | (i >>> 1) & 0x5555555555555555L;//1
i = (i & 0x3333333333333333L) << 2 | (i >>> 2) & 0x3333333333333333L;//2
i = (i & 0x0f0f0f0f0f0f0f0fL) << 4 | (i >>> 4) & 0x0f0f0f0f0f0f0f0fL;//3
i = (i & 0x00ff00ff00ff00ffL) << 8 | (i >>> 8) & 0x00ff00ff00ff00ffL;//4
i = (i << 48) | ((i & 0xffff0000L) << 16) |
((i >>> 16) & 0xffff0000L) …Run Code Online (Sandbox Code Playgroud) 我对整个位移和c ++都很陌生.
假设我有一个uint8_t 00100100(36),我想检查第3位是否已设置.以下是我现在只做一点的代码.
uint8_t x = 36;
if(x&1<<3)
printf("is set");
Run Code Online (Sandbox Code Playgroud)
如何检查第3 位或第6位是否已设置?我想检查几个比特组合,如第5或第7或第8.
什么是最优雅的方式呢?
我有一个函数,我相信将int转换为浮点值,拆分为值的符号指数和分数组成部分.使用IEEE 754表示浮点值.
unsigned test(unsigned x) {
// split the given bits of sign exponent and fraction, combine to return
unsigned int sign = (x & 0x80000000) >> 31;
unsigned int expo = (x & 0x7F800000) >> 23;
unsigned int frac = (x & 0x007fffff);
return (sign << 31) | (expo << 23) | frac;
}
Run Code Online (Sandbox Code Playgroud)
但我不确定如何从这个浮点表示计算减半或加倍的值.
unsigned doubled(unsigned x) {
// get float
// float = unsigned int to float
// doubleFloat = 2*f
// if float is not a …Run Code Online (Sandbox Code Playgroud) 我在论坛上提到给定的n数字数组:
arr[0........n-1]
Run Code Online (Sandbox Code Playgroud)
以下条件成立,^是xor运算符`
f(l,r) = f(0,r) ^ f(0,l-1)
Run Code Online (Sandbox Code Playgroud)
在哪里 f(l,r) = arr[l]^arr[l+1]^........arr[r]
我检查了上面的数组数量和不同值landr和YES,这是真的。但我不明白怎么办?
有人可以解释一下这背后的逻辑吗?