Tag: 位操作

Java中将位打包成byte 并将其读回的最有效方法是什么?

我目前使用这两个函数来打包和读取字节数组中的位。 想知道是否有人有更好的想法或更快的方法吗? 通过更多优化编辑程序并提出一些计算。 目前100mil的Put and Get大约需要12秒而不是16秒。 如果有人正在使用当前代码,请确保传入Put的值是正数,因为它期望无符号数字下降。 如果有兴趣,我可以提出签名和未签名的版本。 class BitData { static void Put(byte Data[], final int BitOffset, int NumBits, final int Value) { final long valLong=(Value&((1L<>3; int posBit=BitOffset&7; int valByte; int ModifyBits; long lValue; int LeftShift; ModifyBits=8-posBit; if(NumBits<ModifyBits) ModifyBits=NumBits; LeftShift=(8-posBit-ModifyBits); while(true) { valByte = Data[posByte]; if(ModifyBits==8) { lValue=valLong<>(24); Data[posByte]=(byte)lValue; } else { lValue=valLong<>(32-ModifyBits)<<LeftShift; Data[posByte]=(byte)((valByte […]

用于内存减少的Java整数标志和按位运算

使用整数标志和按位运算是减少高容量对象的内存占用的有效方法吗? 记忆足迹 我的理解是,通常将boolean存储为JVM实现中的int 。 它是否正确? 在这种情况下,32个标志肯定代表了大量的内存占用减少。 虽然JVM实现当然有所不同,但情况可能并非总是如此。 性能 我的理解是,CPU是非常数字驱动的,并且按位操作与计算中的内容一样高效。 在布尔运算中使用按位运算会有性能损失 – 甚至增益吗? 备择方案 有没有更好的方法来完成同样的事情? Enum是否允许组合标志,即FLAGX = FLAG1 | FLAG2 FLAGX = FLAG1 | FLAG2 ? 示例代码 注意最后一个方法propogateMove()是递归的,可能每秒被调用数百次,并且直接影响我们应用程序的响应性,因此使用标志来避免逻辑位并调用其他方法。 // FLAGS helper functions private final void setclear(int mask, boolean set) { if (set) set(mask); else clear(mask); } private final void set(int mask) { flags |= mask; } […]

在Java 8中更改为HashMap哈希函数

在java 8 java.util.Hashmap中,我发现了一个变化: static int hash(int h) { h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); 到 : static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 从代码中可以看出,新函数是低16位的简单XOR ,高16位保持高16位不变,与之前实现中的几个不同的位移相反,并且从评论中看,这不太有效。将较低位的大量冲突的散列函数的结果分配给不同的桶,但通过减少操作来节省CPU周期。 我在发行说明中看到的唯一一件事就是从链接列表到平衡树的变化以存储碰撞键(我认为这可能会改变计算好哈希的时间量),我特别感兴趣的是看到如果此更改对大型哈希映射有任何预期的性能影响。 是否有关于此更改的任何信息,或者是否有更好的哈希函数知识的人知道此更改的含义可能是什么(如果有的话,我可能只是误解了代码)以及是否需要生成哈希迁移到Java […]

如何在Java中将int转换为三个字节?

我试图将一个int转换为三个bytes表示int (big endian)。 我确定它与逐位和位移有关。 但我不知道如何去做。 例如: int myInt; // some code byte b1, b2 , b3; // b1 is most significant, then b2 then b3. *注意,我知道int是4个字节,三个字节有可能过度/不足。

按位运算符的两个数的和

我粘贴代码以使用按位运算符查找两个数字的总和。 请建议是否可以优化。 谢谢… public static int getSum(int p, int q) { int carry=0, result =0; for(int i=0; i<32; i++) { int n1 = (p & (1<>(i); //find the nth bit of p int n2 = (q & (1<>(i); //find the nth bit of q int s = n1 ^ n2 ^ carry; //sum of bits […]

如何在Java中使用bitshifting

我正在尝试构建一个IP头。 IP头具有以下字段:版本,IHL,DSCP等。我想填充字节数组,以便我可以以字节存储信息。 然而,我感到困惑的是,Version字段只有4位宽。 国际人道法也只有4位宽。 如何将这两个字段的值拟合为一个字节? 我需要做位移吗? 例如版本= 4,IHL = 5.我需要创建一个等于0100 0101 = 45h或69十进制的字节。

按位运算符结果如何发生?

我很惊讶我在Google上找不到这个简单的问题答案。 在检查了十几个不同的页面后,我将在这里问… 根据这个页面 ,3和5导致1.另外,3 | 5结果是7.我唯一的问题就是: 我们如何获得1和3和5? 我们如何获得3 for 3 | 5? 还有,负数呢? 8&-8如何导致8? 果然,在java中编写以下内容: System.out.println(3&5); System.out.println(3|5); System.out.println(8&-8); 生成此输出: 1 7 8 但同样,这些结果如何确定/计算?

我需要Bit Twiddling的帮助

我喜欢看到人们编写Bit Twiddling代码,但我根本无法理解它。 通过Hacker’s Delight和http://graphics.stanford.edu/~seander/bithacks.html ,但我没有理解任何事情。 例如: 怎么来1 | 2 1 | 2返回3或如何来a ^=b; b ^= a; a ^=b; a ^=b; b ^= a; a ^=b; 交换价值等… 一种方法: private T[] ensureCapacity(int minCapacity) { if (tmp.length minCapacity newSize |= newSize >> 1; int newSize = minCapacity; newSize |= newSize >> 2; newSize |= newSize >> 4; newSize […]

为什么两个短值的按位AND导致Java中的int值?

short permissions = 0755; short requested = 0700; short result = permissions & requested; 我收到编译器错误: error possible loss of precision found : int required: short 如果我不完全错误,二进制AND的结果与最长的操作数一样长。 为什么结果是整数? 如果我能做空,会不会有性能损失? (short) permissions & requested

java位是否循环变换?

我有这种使用Java的行为: int b=16; System.out.println(b<<30); System.out.println(b<<31); System.out.println(b<<32); System.out.println(b<<33); 输出:0 0 16 32 java位移位是圆形的吗? 如果没有,为什么我在b << 30和16时b <32时得到0?