新足迹

 找回密码
 注册

精华好帖回顾

· 【原创】带着KIA Stinger下赛道,归来谈谈感想。82楼更新下赛道费用细节。 (2021-12-23) heroxk · 【摄出你的足迹】拍三年 (2013-1-3) 星星星星
· SK 世界流行音乐系列之 PINK (包括 dear mr president mtv) (2008-3-4) steveking · MEL买房回忆录(7。15全文更新完毕,欢迎讨论) (2009-7-4) ltbamboo
Advertisement
Advertisement
查看: 2614|回复: 30

位运算的OR(|)能不能反转得到原始数字?? [复制链接]

发表于 2011-11-2 14:39 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
在SQL Server里面:

               1 代表 Sunday
               2 代表 Monday
               4 代表 Tuesday
               8 代表 Wednesday
               16 代表 Thursday
               32 代表 Friday
               64 代表 Saturday


假设一周全选的话,那么7个数字【OR操作】后就是127;

如果不选Friday(32)的话,那么运算之后是95;

如果不选Tuesday(4)和Saturday(64)的话结果是59,以此类推。



我现在如果已经知道最后的结果(一个数字),如何可以反算出哪一个数字(天)没有被选择?


谢谢!
Advertisement
Advertisement

发表于 2011-11-2 15:03 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
declare @x int
set @x = 59

if (127-@x) & 1 = 1 --  sunday没选
...
if (127-@x) & 2 = 2 --  monday没选
...
if (127-@x) & 4 = 4 --  tuesday没选
...
if (127-@x) & 8 = 8 --  wednesday没选
...
if (127-@x) & 16 = 16 --  thursday没选
...
if (127-@x) & 32 = 32 --  friday没选
...
if (127-@x) & 64 = 64  -- saturday没选
...

[ 本帖最后由 jerryclark 于 2011-11-2 14:24 编辑 ]

评分

参与人数 1积分 +2 收起 理由
BJ-KING + 2

查看全部评分

2010年度奖章获得者

发表于 2011-11-2 15:04 |显示全部楼层
此文章由 粉猪妈妈 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 粉猪妈妈 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Monday=忙day;
Tuesday=求死day;
Wednesday=未死day;
Thursday=受死day;
Friday=福来day;
Saturday=洒脱day;
Sunday=伤day
今天是未死day

评分

参与人数 1积分 +2 收起 理由
BJ-KING + 2 歪楼天使你好:)

查看全部评分

发表于 2011-11-2 15:06 |显示全部楼层
此文章由 yuba 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yuba 所有!转贴必须注明作者、出处和本声明,并保持内容完整
转成二进制表达,哪位是0就是哪天没选

59(Dec) = 0111011(Bin),所以是Tuesday和Saturday没选

评分

参与人数 1积分 +2 收起 理由
BJ-KING + 2

查看全部评分

发表于 2011-11-2 15:06 |显示全部楼层
此文章由 RBA 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 RBA 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 粉猪妈妈 于 2011-11-2 15:04 发表
Monday=忙day;
Tuesday=求死day;
Wednesday=未死day;
Thursday=受死day;
Friday=福来day;
Saturday=洒脱day;
Sunday=伤day
今天是未死day



你兴趣真广泛啊,IT 板块也光临

评分

参与人数 1积分 +1 收起 理由
BJ-KING + 1 见者有份:)

查看全部评分

发表于 2011-11-2 15:09 |显示全部楼层
此文章由 zxzzd 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zxzzd 所有!转贴必须注明作者、出处和本声明,并保持内容完整
4楼正解.


原帖由 yuba 于 2011-11-2 15:06 发表
转成二进制表达,哪位是0就是哪天没选

59(Dec) = 0111011(Bin),所以是Tuesday和Saturday没选
Advertisement
Advertisement

发表于 2011-11-2 15:11 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 yuba 于 2/11/2011 02:06 PM 发表
转成二进制表达,哪位是0就是哪天没选

59(Dec) = 0111011(Bin),所以是Tuesday和Saturday没选

你把代码写出来。

发表于 2011-11-2 15:13 |显示全部楼层

回复 jerryclark 7# 帖子

此文章由 yuba 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yuba 所有!转贴必须注明作者、出处和本声明,并保持内容完整
:-),代码不重要

发表于 2011-11-2 15:16 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 yuba 于 2/11/2011 02:13 PM 发表
:-),代码不重要

你的思路很难写代码的。难道你要转换成nvarchar,然后substring比较每个字符?

发表于 2011-11-2 15:20 |显示全部楼层
此文章由 pengruijun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 pengruijun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
2, 4楼的本质是一样。 转换成8421码, 就都一样了。

发表于 2011-11-2 15:32 |显示全部楼层
此文章由 yuba 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yuba 所有!转贴必须注明作者、出处和本声明,并保持内容完整
请楼主注意,四楼的思路很难写出代码

评分

参与人数 1积分 +2 收起 理由
jerryclark + 2 你太有才了

查看全部评分

Advertisement
Advertisement

发表于 2011-11-2 15:39 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
好吧,如果用C#代码实现的话,杰瑞克拉克和浴霸的算法谁更容易写?

发表于 2011-11-2 15:41 |显示全部楼层
此文章由 dramaking 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dramaking 所有!转贴必须注明作者、出处和本声明,并保持内容完整
4楼的思路不就是2楼的代码么。。。。

按位或获得的结果肯定可以通过按位与反向得到答案啊。。。。。

发表于 2011-11-2 15:41 |显示全部楼层

回复 jerryclark 2# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我先按照你的算法写一个看看结果,谢谢


顺便问一下,神人的头像是怎么做的?

发表于 2011-11-2 15:43 |显示全部楼层
此文章由 dramaking 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dramaking 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不过2楼的代码。。。。是不是结果反了啊。。。。

如果If条件成立。。。。应该是这一天被选中了把。。。。。

发表于 2011-11-2 15:44 |显示全部楼层
此文章由 dramaking 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dramaking 所有!转贴必须注明作者、出处和本声明,并保持内容完整
还有。。。。。貌似是“==”,而不是“=”。。。。。
Advertisement
Advertisement

发表于 2011-11-2 15:48 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 BJ-KING 于 2/11/2011 02:39 PM 发表
好吧,如果用C#代码实现的话,杰瑞克拉克和浴霸的算法谁更容易写?

[Flags]
Enum DayOfWeek {Sunday = 1, Monday = 2,.....Saturday = 64}

发表于 2011-11-2 15:49 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 BJ-KING 于 2/11/2011 02:41 PM 发表
我先按照你的算法写一个看看结果,谢谢


顺便问一下,神人的头像是怎么做的?


测试好了汇报一下结果。我还没有试过。

发表于 2011-11-2 15:50 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dramaking 于 2/11/2011 02:44 PM 发表
还有。。。。。貌似是“==”,而不是“=”。。。。。


==是C#,
=是sql

发表于 2011-11-2 15:54 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
declare @x int
set @x = 59

if (127-@x) & 1 = 1   
print 'Sunday'
if (127-@x) & 2 = 2   
print 'Monday'
if (127-@x) & 4 = 4   
print 'Tuesday'
if (127-@x) & 8 = 8  
print 'Wednesday'
if (127-@x) & 16 = 16   
print 'Thursday'
if (127-@x) & 32 = 32  
print 'Friday'
if (127-@x) & 64 = 64   
print 'Saturday'







我试过了,运行结果“:
Tuesday
Saturday

评分

参与人数 1积分 +2 收起 理由
BJ-KING + 2 不得不顶

查看全部评分

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2011-11-2 16:01 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
用二进制算可能比较方便吧?
比如
if (00010000 && 10100100 ==00010000) print 'friday'
这样的。

评分

参与人数 1积分 +1 收起 理由
BJ-KING + 1

查看全部评分

Advertisement
Advertisement

发表于 2011-11-2 16:08 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
今天没分了,感谢各位神仙的参与,又一次见证奇迹的时刻!

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2011-11-2 16:09 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
bit operation速度也快,而且可以做一些其他算法做不到的。
我的代码大概差不多看看,好久没有碰编程了。肯定有问题。

发表于 2011-11-2 17:25 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dramaking 于 2/11/2011 02:43 PM 发表
不过2楼的代码。。。。是不是结果反了啊。。。。

如果If条件成立。。。。应该是这一天被选中了把。。。。。

没有反。

发表于 2011-11-2 21:12 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
bitwise operation,shifting right 1 bit at a time in particular can be simulated by divided by 2, as in...

--assign the number to @x

declare @x int
declare @cnt int
set @x=59
set @cnt=-1

while (@x>0)
begin
  if (@x%2=0)
  begin
        print datename(dw,@cnt)
  end
  set @x/=2
  set @cnt+=1
end

while(@cnt<=5)
begin
   print datename(dw,@cnt)
   set @cnt+=1
end

评分

参与人数 2积分 +6 收起 理由
jerryclark + 3 你太有才了
IsDonIsGood + 3 偶对你的景仰如滔滔江水

查看全部评分

发表于 2011-11-7 22:18 |显示全部楼层
此文章由 nali 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 nali 所有!转贴必须注明作者、出处和本声明,并保持内容完整
value=59

awk -v num=$value 'BEGIN { day="Sat Fri Thu Wed Tue Mon Sun"
                           bit="64 32 16 8 4 2 1"
                       split(day,a," ");split(bit,b," ");s=0
                       while (num!=0){
                          if (num%2=="0") print a[7-s], "(" b[7-s] ") is not selected"
                          num=(num-num%2)/2;
                          s++
                       }
                       while (s<7) {
                          print a[7-s], "(" b[7-s] ") is not selected"
                          s++
                        }
                      }'

Tue (4) is not selected
Sat (64) is not selected

[ 本帖最后由 nali 于 2011-11-7 22:50 编辑 ]
Advertisement
Advertisement

退役斑竹

发表于 2011-11-7 22:52 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
俺不知道C#里面bit操作怎么写
用纯C就好写了。

for ( i= 0 ;i<7;i++)
{
    if ( value& 0x01==0)
    {
           printf(" Day : %d", i);
          // lz自己 周x 转换一下吧
    }
   value= value>>1
}
专攻电子电路

退役斑竹

发表于 2011-11-8 10:53 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
替 Yuba写了个代码.

还我花了半小时查怎么写C#的 array和printf
        static void Main(string[] args)
        {
            int  i;
            Int16 value = 59;
            string[] weekdays = new string[] {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri","Sat"};
            for ( i= 0 ;i<7;i++)
            {
                if ( (value & 0x01)==0)
                {
                    Console.WriteLine(weekdays);
                    
                }
                value = (Int16)(value>>1);
            }
        }

评分

参与人数 1积分 +2 收起 理由
BJ-KING + 2 精品文章

查看全部评分

专攻电子电路

发表于 2011-11-8 10:58 |显示全部楼层

回复 大饼 28# 帖子

此文章由 yuba 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yuba 所有!转贴必须注明作者、出处和本声明,并保持内容完整
谢谢,但这不是我的算法

我的转换算法是这样的
binaryString = Convert.ToString(59, 2);

比较和输出就从略了

发表于 2011-11-9 12:59 |显示全部楼层
此文章由 鱼羊鲜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 鱼羊鲜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
某些权限系统就是这么做的嘛 777

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部