Tag: 位操作

在Java中使用bitwise&operator和+会产生不一致的结果

有人可以解释为什么这两个Java代码表现不同吗? 第一个正确计算位数,但第二个只显示1或0表示非零数字。 我不明白发生了什么事。 public static void printNumUnitBits(int n){ int num=0; for(int i=0;i>>1; } System.out.println(“Number of one bits:”+num); } public static void printNumUnitBits(int n){ int num=0; for(int i=0;i>>1; } System.out.println(“Number of one bits:”+num); }

为什么“010”等于8?

我的简单问题是为什么: System.out.println(010|4); 打印“12”? 我理解按位OR运算符,但为什么“010”等于8? 这绝对不是恭维2的通知,那么如何解码这个数字呢?

如何有效地转置2D位矩阵

我一直在绊倒这个问题(例如在这个问题中 )。 给定基本整数类型数组forms的2D位矩阵/板/arrays,例如long数组。 为简单起见,我们可以假设一个方阵,例如,在64位long平台上具有64个long值的数组。 令x[i]为0 <= i < 64为输入数组。 计算数组y[i]为0 <= i <= 64这样: (x[i] >> j) & 1 == (y[j] >> i) & 1 这里x >> i是x >> i的按位右移i位, &是按位,并且x[i]是数组x第i个位置的值。 如何实现一个最有效地将数组x映射到数组y的函数? 主要是我正在寻找非破坏性的方法,使输入数组x完好无损。 实施语言 使用的编程语言应该对整数类型进行数组和按位运算。 许多语言都满足这些要求。 C / C ++和Java解决方案看起来非常相似,所以让我们选择这些语言。

为什么Java掩码移位操作数为0x1F?

在Java中: (0xFFFFFFFF << 1) = 0xFFFFFFFE = 0b1111111111111110 : : : (0xFFFFFFFF << 30) = 0xE0000000 = 0b1110000000000000 (0xFFFFFFFF << 30) = 0xC0000000 = 0b1100000000000000 (0xFFFFFFFF << 31) = 0x80000000 = 0b1000000000000000 然而: (0xFFFFFFFF << 32) = 0xFFFFFFFF = 0b1111111111111111 逻辑上这没有任何意义,但我认为正在发生的是Java执行类似于以下操作的操作: a << (b % Integer.SIZE) [编辑,显然:] a << (b & 0x1F) 这也适用于>>和>>> 。 显然,移位> […]

在if语句中使用按位和内部

在C中,我可以写一个if语句 if (firstInt & 1) 但是当我尝试在Java中做同样的事情时,编译器告诉我“不兼容的类型”并说我需要一个boolean而不是一个int 。 有没有办法在Java中编写C代码?

仅加密图像文件的内容而不加密整个文件

我正在创建一个APP,只需要记录图像的内容。 我需要在转换后文件仍然是图像,但显示的图像不显示为原始图像。 例如,我将加密的图像发送给其他用户,这个图像将能够显示和图像(但不是原始图像),但原始图像在该文件中被加密。 使用以下algorythm我加密了整个文件,由于标头也被加密,因此无法将其作为图像打开。 我正在使用这个algorythm,但我不知道如何只加密数据或如何在java / android中添加/修改图像的标题: public byte[] encrypt_image(Bitmap bm, String password_) { byte[] encryptedData = null; try{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] b = baos.toByteArray(); byte[] keyStart = password_.getBytes(); KeyGenerator kgen = KeyGenerator.getInstance(“AES”); SecureRandom sr = SecureRandom.getInstance(“SHA1PRNG”, “Crypto”); sr.setSeed(keyStart); kgen.init(128, sr); SecretKey skey = kgen.generateKey(); byte[] key = skey.getEncoded(); […]

确定字符串具有所有唯一字符,而不使用其他数据结构且不使用小写字符假设

这是Gayle Laakmann McDowell在“ Cracking the Coding Interview”一书中的一个问题: 实现算法以确定字符串是否具有所有唯一字符。 如果您不能使用其他数据结构怎么办? 作者写道: 我们可以通过使用位向量来减少空间使用量。 我们将在下面的代码中假设字符串只是小写’a’到’z’ 。 这将允许我们只使用一个int。 作者有这样的实现: public static boolean isUniqueChars(String str) { int checker = 0; for (int i = 0; i < str.length(); ++i) { int val = str.charAt(i) – 'a'; if ((checker & (1 < 0) return false; checker |= (1 << val); } […]

按位否定会产生意外结果

我试图在java中编写一个按位计算器,你可以输入一个表达式,如~101,但是当我运行这段代码时它会返回10 import java.util.Scanner; public class Test { public static void main(String[] args) { Integer a = Integer.valueOf(“101”, 2); System.out.println(Integer.toString(~a,2)); } } 它输出-110为什么?

两个整数(或多头)没有溢出的平均值,截断为0

我想用Java计算任意两个整数x,y的计算方法(x + y)/2 。 如果x + y> Integer.MAX_VALUE或<Integer.MIN_VALUE,则天真的方式会遇到问题。 Guava IntMath 使用这种技术: public static int mean(int x, int y) { // Efficient method for computing the arithmetic mean. // The alternative (x + y) / 2 fails for large values. // The alternative (x + y) >>> 1 fails for negative values. return (x & y) […]

按位运算符和单个&符号

可能重复: 为什么我们通常使用|| 不是| , 有什么不同? 我可以使用单个&符号而不是像&&那样的按位运算符吗? 可能会出现什么样的差异,是否有一个明确说明这个问题的具体例子?