Tag: 位操作

迭代char的位

假设我有char“C”,其ascii代码是0110 0111 。 我怎样才能迭代它的位? 我想从这些1和0构建一个向量….

按位运算

我使用的是一种名为DDS的技术,在IDL中,它不支持int 。 所以,我想我会用short 。 我不需要那么多比特。 但是,当我这样做时: short bit = 0; System.out.println(bit); bit = bit | 0x00000001; System.out.println(bit); bit = bit & ~0x00000001; bit = bit | 0x00000002; System.out.println(bit); 它说“类型不匹配:无法从int转换为short”。 当我改变short到long ,它工作正常。 是否有可能在Java中执行这样的按位操作?

使用0xff进行定位,需要澄清

在以下代码段中,请考虑使用注释等效替换第8行 1. private static String ipToText(byte[] ip) { 2. StringBuffer result = new StringBuffer(); 3. 4. for (int i = 0; i 0) 6. result.append(“.”); 7. 8. result.append(ip[i]); // compare with result.append(0xff & ip[i]); 9. } 10. 11. return result.toString(); 12. } .equals()测试确认添加0xff不会改变任何东西。 是否有理由应用此蒙版?

这个位操作在Java中如何工作?

我正在研究Java如何计算int的位集。 在我的脑海里,我有一些像这样的简单(我认为是正确的): public static int bitCount(int number){ final int MASK = 0x1; int count = 0; for(int i = 0; i >> i) & MASK) == MASK){ count++; } } return count; } 相反,我发现了一种方法,我完全不知道在做什么(对我来说似乎很神奇): i = i – ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i […]

这种颜色混合技巧如何工作?

我看到这个Java代码可以非常有效地在两种RGB888颜色之间进行完美的50%混合: public static int blendRGB(int a, int b) { return (a + b – ((a ^ b) & 0x00010101)) >> 1; } 这显然相当于单独提取和平均通道。 像这样的东西: public static int blendRGB_(int a, int b) { int aR = a >> 16; int bR = b >> 16; int aG = (a >> 8) & 0xFF; int bG = […]

获得Java签约的最快方式?

我想将float值的符号作为int值-1或1。 避免条件总是降低计算成本的好主意。 例如,我能想到的一种方法是使用快速bit-shift来获得符号: float a = …; int sign = a >> 31; //0 for pos, 1 for neg sign = ~sign; //1 for pos, 0 for neg sign = sign << 1; //2 for pos, 0 for neg sign -= 1; //-1 for pos, 1 for neg — perfect. 或者更简洁: int sign = (~(a […]

将两条短裤打包成一个整数,处理负面和正面

我正在创建一个PackedUnsigned1616类,它在一个int中存储两个unsigned short,以及一个PackedSigned1616类,它在一个int中存储两个带符号的short。 我已经阅读了按位运算,但我仍然对如何处理有符号和无符号以及大于或小于short的范围(它们作为两个整数传入)的值感到困惑。 这是我到目前为止所得到的: public final class PackedUnsigned1616 { public final int field; private static final int RIGHT = (2 << 15) – 1; private static final int LEFT = ((2 << 31) – 1) ^ RIGHT; public PackedUnsigned1616(int left, int right) { field = (left <> 15; } public int getRight() { return field […]

将字符串表示forms转换为字节

我刚刚开始学习文件压缩,我遇到了一些障碍。 我有一个应用程序,将一个字符串,如“程序”编码为压缩二进制表示”010100111111011000″ (请注意,它仍然存储为字符串)。 Encoding g 111 r 10 a 110 p 010 o 011 m 00 现在我需要使用FileOutputStream将其写入文件系统,我遇到的问题是,如何将字符串“010100111111011000”转换为使用FileOutputStream写入文件系统的byte[] / byte s? 我之前从未使用过位/字节,所以我在这里处于死路。

位移和按位运算可对RGB值进行编码

我想将RGB颜色编码为单个整数值。 假设编码算法是这样的: int code = (blue * 256 * 256) + (green * 256) + red 如何使用位移和/或按位运算符对代码中的RGB组件进行编码/解码?

解释两个数字的安全平均值

每当我需要为二进制搜索等算法平均两个数字时,我总是这样做: int mid = low + ((high – low) / 2); 我最近在这篇文章中看到了另一种方法,但我不明白。 它说你可以用Java做到这一点: int mid = (low + high) >>> 1; 或者在C ++中: int mid = ((unsigned int)low + (unsigned int)high)) >> 1; C ++版本实质上使两个操作数都无符号,因此执行移位会导致算术移位而不是有符号移位。 我理解这两段代码正在做什么,但这如何解决溢出问题? 我认为整个问题是中间值high + low可能溢出? 编辑: 哦,呃。 所有答案都没有完全回答我的问题,但是@John Zeringue的答案让它点击了。 我会试着在这里解释一下。 Java中的(high + low)/2问题并不完全是high + low溢出(它会溢出,因为整数都是有符号的,但所有的位仍然存在,并且没有信息丢失)。 像这样取平均值的问题是分裂。 该部门以签名值运作,因此您的结果将为负数。 相反,使用移位将除以2但考虑位而不是符号(有效地将其视为无符号)。