问题标签 [bits]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
268 浏览

php - 用 PHP 存储一堆 3 位长的二进制数据

我的 PHP 程序正在处理从 0 到 7 的值数组。我试图找到在 PHP 中存储这些值的最有效方法。最有效的意思是使用更少的位数。

很明显,每个值只需要 3 位存储空间(b000=0 到 b111=7)。但是将这些 3 位值存储在二进制字符串中的最有效方法是什么?

我事先不知道需要存储或恢复多少个 3 位值,但可能很多,因此 64 位显然是不够的。

我正在研究 pack() 和 unpack():我可以在每个字节中存储两个值并使用一个 pack('C', $twoValues),但我仍然丢失了 2 位。

它会起作用吗?有没有更有效的方法来存储这些值?

谢谢

0 投票
4 回答
270 浏览

c - 将 N 位与接下来的 N 位(例如每个 4 位)混合 00001111 -> 01010101

正如这个问题的标题所说,我想知道在整数中混合位块的最佳方法(尤其是 64 位无符号)

例如我有 8 位整数,它的位是 0000 1111 混合 4 位乘 4 位 = 0101 0101

示例 2: 0010 0110
0 1 1 0 右 0.0.1.0 左 = 00011100 混合 4 位乘 4 位 = 0001 1100 简单的是,. 充满右块位的地方

我现在在做什么:

其中 setbit 是一个宏,用于设置或清除某个位置的位。我真正需要的是 将每个 32 位与下一个 32 位混合 将每个 16 位与下一个 16 位混合 将每个 16 位与下一个 16 位混合 将每个 8 位与下一个 8 位 等混合...我希望如果有这样的位操作的一个示例,我可以休息一下。我在谷歌上看了很多,但最终得到的教程没有展示这种情况。

保持良好。

0 投票
7 回答
236450 浏览

binary - n 位可以表示多少个值?

例如,如果n=9,那么 9 个二进制数字(位)可以表示多少个不同的值?

我的想法是,如果我将这 9 位中的每一个都设置为 1,我将使这 9 位能够表示的最大数字成为可能。因此,最高值是十进制1 1111 1111中相等的值。511因此,我得出结论,9 位二进制可以表示 511 个不同的值。

我的思维过程正确吗?如果没有,有人可以解释一下我错过了什么吗?我如何将其概括为n位?

0 投票
8 回答
10961 浏览

c - showbits() 函数

在阅读一本名为“Let us C”的书时,我读到showbit()存在一个可以向您显示数字位的函数。没有提到任何特殊的头文件。在互联网上搜索它并没有发现任何有用的东西。有这样的功能吗?我希望它打印十进制数字的二进制。否则请给我一个替换功能。谢谢

0 投票
5 回答
14392 浏览

java - 有效地从 byte[] 数组中提取任意长度的位序列

我正在寻找在任意位置提取任意长度(0 <= 长度 <= 16)的(无符号)位序列的最有效方法。骨架类显示了我当前的实现本质上是如何处理这个问题的:

这可行,但我正在寻找更有效的解决方案(性能方面)。字节数组保证相对较小,在几个字节到最大 ~1800 字节之间。在每次调用 read 方法之间,该数组只被读取一次(完全)。getBits() 中不需要进行任何错误检查,例如超出数组等。


看来我上面最初的问题还不够清楚。N 位的“位序列”形成 N 位的整数,我需要以最小的开销提取这些整数。我对字符串没有用处,因为这些值要么用作查找索引,要么直接输入到某些计算中。所以基本上,上面显示的骨架是一个真实的类,getBits() 签名显示了其余代码如何与之交互。


将示例代码扩展为微基准,包括 blitzpasta 的解决方案(修复丢失的字节掩码)。在我的旧 AMD 机器上,结果显示为 ~11400ms 与 ~38000ms。仅供参考:它是杀死性能的除法和模运算。如果将/8替换为>>3并将%8替换为&7,则两种解决方案都非常接近(jdk1.7.0ea104)。


关于如何工作和做什么工作似乎有点混乱。示例代码的第一个原始帖子包含一个 read() 方法,用于指示字节缓冲区的填充位置和时间。当代码变成 microbench 时,这会丢失。我重新介绍了它以使这一点更清楚。这个想法是通过添加另一个需要实现 getBits() 和 prepareBitGet() 的 BitArray 子类来击败所有现有版本,后者可能是空的。不要更改基准测试来为您的解决方案提供优势,所有现有解决方案都可以这样做,这完全是一个没有实际意义的优化!(真的!!)

我添加了一个 Version0,它只会增加 bitGet 状态。它总是返回 0 以大致了解基准开销有多大。它只是为了比较。

此外,还添加了对 MSN 想法的改编(版本 3)。为了对所有竞争对手保持公平和可比性,字节数组填充现在是基准测试的一部分,也是一个准备步骤(见上文)。最初 MSN 的解决方案做得并不好,准备 int[] 缓冲区有很多开销。我冒昧地对这一步进行了一点优化,这使它变成了一个激烈的竞争对手:) 你可能还会发现我对你的代码进行了一些去复杂化。你的 getBit() 可以被压缩成一个 3-liner,可能会减少 1% 或 2%。我故意这样做是为了保持代码的可读性,并且因为其他版本也没有尽可能浓缩(再次为了可读性)。


结论(上面的代码示例更新为包含基于所有适用贡献的版本)。在我的旧 AMD 机器(Sun JRE 1.6.0_21)上,它们显示为:

V0 未实施耗时5384毫秒
V1 Durandal 的(原始)耗时10283毫秒
V2 blitzpasta(改编)耗时12212毫秒
V3 MSN(已发布)耗时11030毫秒
V4 MSN(半缓冲修改)耗时9700毫秒

注意:在这个基准测试中,每次调用 getBits() 平均获取 7.5 位,并且每个位只读取一次。由于 V3/V4 必须付出高昂的初始化成本,它们往往会表现出更好的运行时行为和更多、更短的提取(因此,平均提取大小越接近最大值 16 越差)。尽管如此,V4 在所有情况下都略微领先于其他所有方案。在实际应用中,必须考虑缓存争用,因为 V3/v4 所需的额外空间可能会增加缓存未命中率,从而使 V0 成为更好的选择。如果要多次遍历数组,则应优先考虑 V4,因为它的获取速度比其他任何方式都快,并且在第一次遍历后可以分摊昂贵的初始化。

0 投票
1 回答
1165 浏览

java - 在 Java 中读取和写入位到文本文件

我正在尝试实现一些压缩算法,我需要处理 Java 中的位。

我需要做的是,当我写入值 1 然后写入值 2 时,这些数字作为位存储在文件中,因此文件大小将是 1 字节而不是 2,因为 1 存储在 1 位中,而 2 是以 2 位存储。

是否可以?非常感谢

0 投票
3 回答
801 浏览

python - 使用 Python 通过 TCP 接收的字符串中的非二进制(十六进制)字符

也许这是一个菜鸟问题,但我正在通过 TCP 接收一些数据,当我查看字符串时,我得到以下信息:

\x00\r\xeb\x00\x00\x00\x00\x01t\x00

那个\r字符是什么,tin\x01t是什么意思?

我试过谷歌搜索,但我不知道谷歌是为了什么......

谢谢。

0 投票
1 回答
419 浏览

c# - C#:手动位转换?

有没有比使用更好的方法来写这个BitConverter

0 投票
2 回答
531 浏览

c# - C# 为什么 127 = 这个位串?

鉴于此代码以整数形式打印所有位:

 

为什么会打印出来:

首先,我是否正确循环,因为我希望最后 7 位数字是 1

其次,为什么中间有一些1?我希望它们都为 0,除了后面的 7 个 1。

0 投票
5 回答
28664 浏览

java - Java 使用位

首先让我说我在编程之前从未真正使用过比特。我有一个可以处于 3 种状态的对象,我想使用 3 位数组来表示这些状态。
例如:

我有一辆赛车,它可以在静止状态下向前、向左和向右前进,
如果汽车向前移动,则位将为 010,如果向前和左,则位将是 110 等等...

我将如何设置这些位以及如何将它们读回以获取值?