我正在通过UDP读取一些MPEG传输流协议,它有一些时髦的位域(例如长度为13).我正在使用"struct"库来进行广泛的解包,但有一种简单的方法可以说"抓住下一个13位"而不必手动调整位操作吗?我想要像C做位字段的方式(不必回复到C).
建议?
我试图从浮点数中提取位而不调用未定义的行为.这是我的第一次尝试:
unsigned foo(float x)
{
unsigned* u = (unsigned*)&x;
return *u;
}
Run Code Online (Sandbox Code Playgroud)
据我了解,由于严格的别名规则,这不能保证工作,对吧?如果使用字符指针进行中间步骤,它是否有效?
unsigned bar(float x)
{
char* c = (char*)&x;
unsigned* u = (unsigned*)c;
return *u;
}
Run Code Online (Sandbox Code Playgroud)
或者我是否必须自己提取单个字节?
unsigned baz(float x)
{
unsigned char* c = (unsigned char*)&x;
return c[0] | c[1] << 8 | c[2] << 16 | c[3] << 24;
}
Run Code Online (Sandbox Code Playgroud)
当然,这有一个缺点,取决于字节顺序,但我可以忍受.
工会黑客肯定是未定义的行为,对吧?
unsigned uni(float x)
{
union { float f; unsigned u; };
f = x;
return u;
}
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这里有一个参考版本foo.也是未定义的行为,对吗?
unsigned ref(float x)
{ …Run Code Online (Sandbox Code Playgroud) 当我阅读以下摘录时,我正在研究计算系统的要素:
Hack计算机包括一个黑白屏幕,组织为256行,每行512像素.屏幕内容由8K存储器映射表示,该映射从RAM地址16384(0x400)开始.物理屏幕中的每一行,从屏幕的左上角开始,在RAM中由32个连续的16位字表示.因此,来自顶部的行r和来自左边的列c的像素被映射到位于RAM [16384 + r*32 + c%16]的字的c%16位(从LSB到MSB计数).为了写入或读取物理屏幕的像素,可以在RAM驻留存储器映射中读取或写入相应的位(1 =黑色,0 =白色).
那么,如果屏幕是256行512像素,并且每个像素是一个比特,那么整个屏幕的8K内存映射怎么样?
256行*512位= 131072/8位/字节/ 1024字节/ K = 16K
那不是一张16K的内存映射吗?
我唯一能想到的是因为字大小是16位,这可能是一个因素吗?我一直都知道"字节"意味着8位,但如果它的定义取决于计算机的字大小,那么这对我来说可能会解开这个谜团.有人可以向我解释该段中描述的屏幕是如何用8K内存映射而不是16K表示的吗?
我从一个字节中抓取n位有点麻烦.
我有一个无符号整数.假设我们的十六进制数是0x2A,十进制是42.在二进制文件中,它看起来像这样:0010 1010.我如何获取前10位是00101,接下来的3位是010,并将它们分成单独的整数?
如果有人能帮助我那将是伟大的!我知道如何从一个字节中提取即可
int x = (number >> (8*n)) & 0xff // n being the # byte
Run Code Online (Sandbox Code Playgroud)
我在另一篇关于堆栈溢出的文章中看到过,但我不确定如何从字节中获取单独的位.如果有人能帮助我,那就太好了!谢谢!
我总是对此感到困惑.是否存在Megabits到字节的"标准"转换?
是吗:
1 Megabit == 1,000,000 bits == 125,000 bytes
Run Code Online (Sandbox Code Playgroud)
要么:
1 Megabit == 2^20 bits == 1,048,576 bits == 131,072 bytes
Run Code Online (Sandbox Code Playgroud) 我正在尝试为非常简单的加密类型编写解码器.通过扫描仪输入0-255的数字,这些位被反转,然后转换为字符并打印.
例如,数字178应转换为字母"M".
178是10110010.
反转所有位应该给出01001101,即77或"M"作为字符.
我遇到的主要问题是,据我所知,Java不支持无符号字节.我可以将值读取为int或short,但由于额外的位,因此在转换期间值将关闭.理想情况下,我可以使用按位补码运算符,但我认为如果我使用带符号数字,我最终会得到负值.关于如何处理这个问题的任何想法?
我正在写一个C程序.我想要一个我可以作为char访问的变量,但我也可以访问特定的位.我以为我可以使用像这样的联盟......
typedef union
{
unsigned char status;
bit bits[8];
}DeviceStatus;
Run Code Online (Sandbox Code Playgroud)
但编译器不喜欢这个.显然你不能在结构中使用位.那么我该怎么做呢?
有谁知道如何提取位字段成员的大小.下面的代码自然给出了一个整数的大小,但是如何找出有多少位或字节mybits.one?我已经尝试过,sizeof(test.one)但显然无法正常工作.我意识到这是一个衡量标准:
#include <iostream>
using namespace std;
int main()
{
struct mybits {
unsigned int one:15;
};
mybits test;
test.one = 455;
cout << test.one << endl;
cout << "The size of test.one is: " << sizeof(test) << endl;
}
Run Code Online (Sandbox Code Playgroud) 我已经阅读了关于使用两个补码的二进制乘法的这篇文章.但对我来说不是很清楚.即使我很难理解维基文章.我想知道如何计算负数的乘法:
eg: -1 with -7 should give 7.
A 4-bit, 2's complement of -1 is : 1111
A 4-bit, 2's complement of -7 is : 1001
Run Code Online (Sandbox Code Playgroud)
计算乘法的一些逐步方法将是有帮助的.没有我遇到过关于分裂的文章.怎么解决这个问题?
到目前为止,我认为它们与由字节组成的字节相同,并且双方需要知道另一侧的字节大小和端点并相应地转换流.然而,维基百科说byte stream!= bit stream(https://en.wikipedia.org/wiki/Byte_stream)并且bit streams专门用于视频编码(https://en.wikipedia.org/wiki/Bitstream_format).在这个RFC https://tools.ietf.org/html/rfc107中,他们讨论了这两件事并进行了描述Two separate kinds of inefficiency arose from bit streams..我的问题是:
bits ×10
byte ×3
c++ ×3
binary ×2
bit-fields ×2
c ×2
bytestream ×1
complement ×1
division ×1
hex ×1
java ×1
megabyte ×1
python ×1
standards ×1
streaming ×1
structure ×1
type-punning ×1
udp ×1
unions ×1
unsigned ×1