查看: 1320| 回复: 7
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 常用位操作总结

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 14417335 于 2019-2-18 08:38 编辑

见5垅,楼主提交的修正版。

评分

参与人数 2大米 +6 收起 理由
arcovitcher + 3 给你点个赞!
Scala688 + 3 给你点个赞!

查看全部评分


上一篇:面試時,follow up 資料量太大的準備方向
下一篇:关于简历和刷题
 楼主| greentrail 2019-2-18 01:09:27 | 只看该作者
全局:
多谢!是应该加上括号,有两处,我都修改过了。

去掉最后一位        x >> 1
在最后加一个0        x << 1
在最后加一个1        (x << 1) + 1
把最后一位变成1        x | 1
把最后一位变成0        (x | 1) - 1
最后一位取反        x ^ 1
把右数第k位变成1        x | ( 1 << (k–1))
把右数第k位变成0        x & ~(1 << (k–1))
右数第k位取反        x ^ (1 << (k–1))
取末尾三位        x & 7
取末尾k位        x & (1 << k – 1)
取右数第k位        x >> (k–1) & 1
末k位变成1        x | (1 << k – 1)
末k位取反        x ^ (1 << k – 1)
把右边连续的1变成0        x & (x+1)
把右边起第一个0变成1        x | (x+1)
把右边连续的0变成1        x | (x-1)
取右边连续的1        (x ^ (x+1)) >> 1
去掉右起第一个1的左边        x & (x ^ (x-1))
取最后一个1, ‘1010’->’0010’        x – (x & (x-1))
x & -x

另外,再加一个新的

记二进制表示中1的个数
unsigned countSetBits(int n) {
    unsigned count = 0;
    while (n) {
      n &= (n-1) ;
      count++;
    }
    return count;
}

评分

参与人数 1大米 +5 收起 理由
14417335 + 5 很有用的信息!

查看全部评分

回复

使用道具 举报

推荐
 楼主| greentrail 2019-2-18 08:00:58 | 只看该作者
全局:
我把需要加括号的地方都加上了,这样不会有歧义。我用C++测的。

去掉最后一位        x >> 1
在最后加一个0        x << 1
在最后加一个1        (x << 1) + 1
把最后一位变成1        x | 1
把最后一位变成0        (x | 1) - 1
最后一位取反        x ^ 1
把右数第k位变成1        x | ( 1 << (k–1))
把右数第k位变成0        x & ~(1 << (k–1))
右数第k位取反        x ^ (1 << (k–1))
取末尾三位        x & 7
取末尾k位        x & ((1 << k) – 1)
取右数第k位        (x >> (k–1)) & 1
末k位变成1        x | ((1 << k) – 1)
末k位取反        x ^ ((1 << k) – 1)
把右边连续的1变成0        x & (x+1)
把右边起第一个0变成1        x | (x+1)
把右边连续的0变成1        x | (x-1)
取右边连续的1        (x ^ (x+1)) >> 1
去掉右起第一个1的左边        x & (x ^ (x-1))
取最后一个1, ‘1010’->’0010’        x – (x & (x-1))
x & -x
回复

使用道具 举报

🔗
14417335 2019-2-16 04:50:50 | 只看该作者
全局:
这个帖子不错!但是好像还有些错误。
回复

使用道具 举报

🔗
 楼主| greentrail 2019-2-17 03:51:37 | 只看该作者
全局:
> 这个帖子不错!但是好像还有些错误。

能否指出那个错了?给个例子行吗?

如果我把错的共享给大家了,责任就大了
回复

使用道具 举报

🔗
14417335 2019-2-17 04:13:01 | 只看该作者
全局:
greentrail 发表于 2019-2-17 03:51
> 这个帖子不错!但是好像还有些错误。

能否指出那个错了?给个例子行吗?

如果你用的是java,绝大部分是正确的。就是要注意()。
比如
在最后加一个1        x << 1 + 1
应该
  1. (x << 1) + 1
复制代码
回复

使用道具 举报

全局:
很有帮助!多谢总结!
回复

使用道具 举报

🔗
 楼主| greentrail 2019-2-18 08:03:35 | 只看该作者
全局:
我不知道怎么在原帖中highlight改动的地方。还请版主帮忙!

(主要是不想给大家错误的信息)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表