Tag: 位操作

数组A的子集,如果我们对该子集的所有元素执行AND,则输出应为2的幂

我得到了这个问题的解决方案: 给定一个数组A.是否存在数组A的任何子集,如果我们对该子集的所有元素执行AND,则输出应该是2的幂(例如:1,2,4,8,16等等)。 输入:第一行包含多个测试用例T.每个测试第一行包含N个数组A,下一行包含N个空格分隔的整数。 输出:对于每个测试用例,如果存在arraysA的任何子集,则打印YES,如果我们对该子集的所有元素执行AND,则输出应该是其他两个打印NO的幂。 解决方案是这样的,但我无法理解下面的解决方案。 请帮忙。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = br.readLine(); int N = Integer.parseInt(line); for (int i = 0; i < N; i++) { int num = Integer.parseInt(br.readLine()); int[] arr = new int[num]; String arrCnts = br.readLine(); String[] arrStr = arrCnts.split(" "); boolean flag = false; int max = […]

算术左移时间复杂度

什么是*算术左移的时间复杂度 * / *算术右移*位操作数的运算符,例如x = y << 2; 需要多少时间?

如何从java中获取int中最重要的n位

我有一个int,我想获得java中19个最重要的位。 我尝试了各种各样的方法,但都没有。 有人可以帮帮我吗?

反向字节顺序为long

我有一个long变量,我需要反转它的字节顺序。 例如: B1, B2, … , B8我应该返回一个由B8, B7, …, B1组成的长B8, B7, …, B1 。 如何通过使用按位运算来实现?

在java中查找RGB的按位版本

我有以下方法获取rgb值并使用较小的调色板对其进行分类: private static int roundToNearestColor( int rgb, int nrColors ) { int red = ( rgb >> 16 ) & 0xFF; int green = ( rgb >> 8 ) & 0xFF; int blue = ( rgb & 0xFF ); red = red – ( red % nrColors ); green = green – ( green % […]

将4个字节转换为无符号的32位整数并将其存储为long

我正在尝试用Java读取二进制文件。 我需要读取无符号8位值,无符号16位值和无符号32位值的方法。 这样做的最好(最快,最好看的代码)是什么? 我用c ++完成了这个并做了类似这样的事情: uint8_t *buffer; uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24; 但是在Java中,如果例如buffer [1]包含一个设置了符号位的值,则会导致问题,因为左移的结果是int(?)。 而不是OR:在特定的位置只有0xA5,或者在0xFFFFA500或类似的东西中,这会“损坏”两个顶部字节。 我现在有一个代码,看起来像这样: public long getUInt32() throws EOFException, IOException { byte[] bytes = getBytes(4); long value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24); return […]

为什么在Java中-1右移1 = -1?

我遇到了一个问题“为什么-1是零填充右移1 = 2147483647对于Java中的整数?” 从上面的问题的答案中我完全理解零填充右移的概念。 但是当我试图找到-1 >> 1时,我得到一个完全复杂的答案,我觉得很难理解。 -1二进制forms如下:11111111111111111111111111111111翻转后,我得到:00000000000000000000000000000000加1后,我得到:00000000000000000000000000000001现在向右移一个位置:00000000000000000000000000000000翻转位后,我得到:11111111111111111111111111111111现在加1 :00000000000000000000000000000000 我不明白-1 >> 1本身是-1,那么?

在java中苦苦挣扎 – 将long分解为long 的bitmasks

我正在将一个长的分解为长的单个长的[] public static int decompose(long[] buffer, long base) { int count = Long.bitCount(base); for (int i=0; i<count; i++) { base ^= (buffer[i] = Long.lowestOneBit(base)); } return count; } 但我觉得可能有更快的方法来做到这一点,因为看起来有一些重复的步骤。 例如,计算这些位应该已经非常接近于获得填充结果所需的所有信息。 有什么建议么? 我熟悉过早的优化口头禅,因此为什么我不会在我的时间推进我的解决方案,但也许其他人之前已经看过这个或沉迷于优化…编辑:请通过测试运行任何建议马克马克提供如下 。 我的第一次暗示实际上是在坚持,我有点惊讶。 测试代码,它位于JUnit方法中: Random rng = new Random(); long size = 0; long[] hold = new long[Long.SIZE]; System.out.println(“init:”+Long.toBinaryString(BitTwiddling.bitmask(rng.nextInt(Long.SIZE)))); //initialize BitTwiddling internals long start […]

删除特定索引处的位

我基本上试图从特定索引处的整数中删除一点。 也就是说,我不想取消/清除这一点; 我实际上想剥离它,以便每个更高的位向下移动,替换其位置的相应位。 在视觉上,可以将其与从数组中删除元素或从字符串中删除字符进行比较。 为清楚起见,举例说明: 1011011 (original number) ^ index = 2 0101111 (result) 10000000000000000000000000000001 ^ index = 31 00000000000000000000000000000001 1111111111111111111111111111110 ^ index = 0 0111111111111111111111111111111 我充满信心地开始转移一些东西,并提出了以下Java方法…… public static int removeBit(int num, int i) { int out = (num >>> (i + 1)) << i; out |= (num <>> (32 – i); return out; } […]

为按位操作声明掩码

我是这样的低级别操作的新手,我希望有人可以指出我必须在这里犯下的明显错误。 //Input value – 00111100 //I want to get the value of the bits at indexes 1-3 ie 0111. byte mask = (byte)0x00001111; // This gives 17 not the 15 I’d expect byte shifted = (byte)(headerByte >> 3); //shifted is 7 as expected byte frameSizeValue = (byte)(shifted & mask); //Gives 1 not 7 看起来问题在于定义掩码的方式,但我看不出如何修复它。