Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. # js bitwise cheat sheet
  2.  
  3. ```js
  4. var INIT = 0x1 // 0 0 0 0 1
  5. , PENDING = 0x2 // 0 0 0 1 0
  6. , DONE = 0x4 // 0 0 1 0 0
  7. , ERROR = 0x8 // 0 1 0 0 0
  8. , SUCCESS = 0x10 // 1 0 0 0 0
  9. , ALL = 0x1f // 1 1 1 1 1
  10. ```
  11.  
  12. ## set
  13.  
  14. ```js
  15. var state = INIT
  16. state &=~ INIT // remove INIT
  17. // state = every `1` bit of state BUT NOT any of INIT
  18. state |= PENDING // add PENDING
  19. // state = every `1` bit of both states
  20. state |= ERROR // add ERROR
  21. state &=~ PENDING // remove PENDING
  22. state |= DONE // add DONE
  23. // state has ERROR & DONE
  24. state ^= ALL // toggle all bytes
  25. // state has INIT, PENDING, SUCCESS
  26. ```
  27.  
  28. * `&=~ ANY_STATE` remove state
  29. * `&=~ ALL` remove all states
  30. * `|= ANY_STATE` add state
  31.  
  32. ## check
  33.  
  34. ```js
  35. if(state & (ERROR | SUCCESS)) {
  36. console.log("is error or success")
  37. /* `state` HAS (WHETHER `ERROR` OR `SUCCESS`) */
  38. }
  39. if(state & (DONE & SUCCESS)) {
  40. console.log("is done and successful")
  41. /* `state` HAS (`DONE` AND `SUCCESS`) */
  42. }
  43. if(!(state & (DONE | SUCCESS))) {
  44. console.log("state isn't done or success")
  45. /* `state` HAS NOT (`DONE` AND `SUCCESS`) */
  46. }
  47. if(state & DONE && !(state & SUCCESS)) {
  48. console.log("state is done but not success")
  49. /* `state` HAS `DONE` AND NOT `SUCCESS`) */
  50. }
  51. ```
  52.  
  53. ## class
  54.  
  55. ```js
  56. var createState = (function(){
  57.  
  58. var hasOwn = {}.hasOwnProperty
  59. , toString = {}.toString
  60. , ARRAY_CLASS = "[object Array]"
  61.  
  62. function State(states){
  63. var self = this
  64. , i = 0, l = states.length
  65. , a = 1
  66. for(;i < l; i++) self[states[i]] = (a <<= 1)
  67. return self
  68. }
  69.  
  70. State.prototype.state = 0
  71.  
  72. State.prototype.add = add
  73. function add(state){
  74. var self = this
  75. , ref = 0
  76. , l
  77. if(state = [].concat(state)) {
  78. l = state.length
  79. for(;l--;) {
  80. if(!(state[l] in self)) throw "State " + state + " doesn't exist"
  81. ref |= self[state[l]]
  82. }
  83. }
  84. self.state |= ref
  85. return self
  86. }
  87.  
  88. State.prototype.remove = remove
  89. function remove(state){
  90. var self = this
  91. , ref = 0
  92. , l
  93. if(state = [].concat(state)) {
  94. l = state.length
  95. for(;l--;) {
  96. if(!(state[l] in self)) throw "State " + state + " doesn't exist"
  97. ref |= self[state[l]]
  98. }
  99. }
  100. self.state &= ~ref
  101. return self
  102. }
  103.  
  104. State.prototype.has = has
  105. function has(state){
  106. var self = this
  107. , ref = 0
  108. , l
  109. if(state = [].concat(state)) {
  110. l = state.length
  111. for(;l--;) {
  112. if(!(state[l] in self)) throw "State " + state + " doesn't exist"
  113. ref |= self[state[l]]
  114. }
  115. }
  116. return (self.state & ref) == ref
  117. }
  118.  
  119. State.prototype.get = get
  120. function get(){
  121. var self = this
  122. , i
  123. , state = self.state
  124. , result = []
  125. for(i in self) {
  126. if(!hasOwn.call(self, i) || i == "state") continue
  127. if(state & self[i]) result.push(i)
  128. }
  129. return result
  130. }
  131.  
  132. function s(){}
  133. s.prototype = State.prototype
  134.  
  135. return function(){
  136. return State.apply(new s, arguments)
  137. }
  138. })()
  139. ```
  140.  
  141. #### usage
  142.  
  143. ```js
  144. var state = createState(["STATE1", "STATE2", "STATE3", "STATE4"])
  145. state.add(["STATE1", "STATE2"])
  146. state.get() // ["STATE1", "STATE2"]
  147. state.add("STATE3").remove("STATE1").get() // ["STATE2", "STATE3"]
  148. state.STATE1 // 2
  149. state.STATE2 // 4
  150. state.STATE3 // 8
  151. state.STATE4 // 16
  152. state.state // 12
  153. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement