一个好玩的计算题目(c++ 位运算)

2015/11/10

  在一个qq群里面,看到一个好玩的题目。“int foo(int x){return x&-x}   foo(2^31-3)这个怎么算 ?”

1、自己也就开始算了:

(1)2^31 = 1000 0000 0000 0000 0000 0000 0000 0000

(2)2^31 - 3 = 1000 0000 0000 0000 0000 0000 0000 0011(2^31是负数) --->理解错误

修改:01111111111111111111111111111101(代码打印 pow(2, 31) - 3)

(3)-(2^31 - 3) = 0111 1111 1111 1111 1111 1111 1111 1101 (补码)

修改:10000000000000000000000000000011(代码打印-(pow(2, 31)-3))

(4)x & -x = 0000 0000 0000 0000 0000 0000 0000 0100 = 4;

修改:00000000000000000000000000000001(代码打印 &= 1)

  群里还有别的朋友算出来是1之类的,但是和结果的2总是相差甚远 ...

2、打开vs把代码拷贝进去

// 2015/11/10 位运算符
int test_bit(int x){
    return x&-x;
}

结果:

nRet = 2

3、理解

(1)打印了一下2^31 = 29,一开始惊了个呆。仔细一想,发现这是c++的抑或运算,自己手动去运算也是对的。

4、 一波未平一波又起

(1)打印了一下2^31 - 3 = 30,又让自己惊了个呆。思前想后,才发现是c++里面的运算符优先级的问题, ‘-‘的优先级大于‘^‘

(2)所以,最后算出来x= 30, -x = -30, x &-x = 2; over!

5、总结:

(1)有意思

(2)以后看到问题还是要想一下语言环境

时间: 2024-08-29 15:42:49

一个好玩的计算题目(c++ 位运算)的相关文章

C#位运算实际运用

前言 前几天写了一篇关于c#位操作,c#位运算基本概念与计算过程 最后提到一个实际问题 需求:C# 用两个short,一个int32拼成一个long型 要求:现在有两个short和一个int,需要拼成一个long型,高16位用short,中间32位用int,最低16位用另外一个short https://bbs.csdn.net/topics/392202825?page=1 答案:((long)shortA << 48 )+ ((long)intA << 16)+ shortB=

C#位运算实际作用之操作整型某一位

1.前言 前几天写了两篇关于c#位运算的文章 c#位运算基本概念与计算过程 C#位运算实际运用 在文中也提到了位运算的实际作用之一就是合并整型,当时引用了一个问题: C# 用两个short,一个int32拼成一个long型,高16位用short,中间32位用int,最低16位用另外一个short. 答案如下: 高16位shortA.中间32位intA.低16位shortB longResult=((long)shortA << 48 )+ ((long)intA << 16)+ s

位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题

转自:https://blog.csdn.net/monster_girl/article/details/52928864 在学习完位操作后,经常会遇到一类关于查找缺失整数的问题. 第一类是给你一个数组,告诉你这些数字的范围是什么,然后让你查找这个缺失的数字(例如无序数组的范围是从1到10,不重复的9个数). 这类问题的解决方法比较多样,第一种,因为给定了范围可以通过计算数字总和值,然后分别减去这些数字,剩下的则是缺失的数字.第二种,对这个数组进行排序,遍历整个数组,然后判断相邻的元素是否连续

位运算 找出给定的数中其他数都是两个,有两个是一个的数

题目大意: 给定你n个数, 其中有n-2个数都是两两成对的,有两个是单独出现的,如n = 8, 2 3 2 5 3 6 4 6, 这时候4和5是单独的两个,所以答案就是4,5,其中n的范围是1e6. 思路: 之前做过找一个单独的数的题,那个题是用一个比较巧妙的方法来做的,不过这个也是一类经典问题,用到了强大的位运算,有了那个题的基础再来做这个题就简单了.(附:找一个的题目链接). 刚开始我是用了O(nlogn)的时间复杂度来做的,先排序,然后用类似找一个的方法找出第二个.我觉得对于1e6的数据量

一个序列,除了一个数出现两次,其他数都出现一次,找出来重复的这个数-位运算应用(异或运算)

一个序列,除了一个数出现两次,其他数都出现一次,找出来重复的这个数-位运算应用 面试的题目 贴一下代码: 1 //位运算应用 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int maxn=1e5+10; 6 7 int n; 8 int a[maxn]; 9 10 void found(){ 11 int xors=0; 12 for(int i=0;i<n;i++){

位运算计算与位运算应用

位运算包括与,或,取反,异或,左移,右移等. 一 位运算计算 1 与运算:& 操作符&将2个数的二进制位进行与操作,2个数对应的位都为1,运算结果为1:否则运算结果为0. 比如 6&8,6的二进制为:0110   8的二进制为:1000.所以6&8 = 0000 = 0 2 或运算:| 操作符|将2个数的二进制位进行或操作,2个数对应的位有一个为1,运算结果为1:否则运算结果为0. 比如 6&8,6的二进制为:0110   8的二进制为:1000.所以6&8

巧用c语言的位运算代替部分求余%计算

网上看到一个文章,里面讲述了四种高效c语言执行的方法, 1.使用空间代替时间 2.使用数学优化,而不是死计算,笨计算 3.使用位运算 4.使用嵌入汇编 前三点比较容易掌握,第四点基本上需要有比较深厚的汇编基础. 这里讲讲位运算, 1.无符号数据中, 左移1位,等价于除以2,右移1位,等价于乘以2,,切记不可溢出. 2.求余数, J = 456 % 32; ——456 - (456 >> 5 << 5);k = 456 % 64; ——456 - (456 >> 6 &l

【编程题目】对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一

45.雅虎(运算.矩阵):1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到. 这道题,是我目前为止做过的最最最最最麻烦.最繁琐的题目了. 思路: 把输入的矩阵一步步还原成 0 矩阵 一个数字,只可能伴随着它上下左右四个方向的数字变化. ①如果数字比它周围四个数的和要大,那么一定不满足条件. ②如果数字小于等于四周的数字和,且其四周仅有一个数字不为0: 不为0的那个周围数字的大小 -=

Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)

import java.util.*; /* * 输入一个整数,计算它各位上数字的和. * (注意:是任意位的整数) */ public class Sum02 { public static void main(String[] args) { System.out.print("请输入任意一个整数:"); Scanner s = new Scanner(System.in); int sum = 0; int t = s.nextInt(); while(t!=0){ sum =